2012-07-10 109 views
1

我是Python新手(通常編程),請耐心等待。Python中的異步事件

我正在做一些實驗室設備自動化,我正在尋找一種方法來切換一臺設備的電源,同時在另一臺設備上獲取數據。我希望這些事件彼此異步,即我希望在數據採集過程中隨機切換電源。

我已經簽出了以下內容:

-time.sleep - 我居然能在一個設置成功使用此,因爲電源是響應很慢 - 我告訴它關閉然後休息一段時間,然後開始在其他設備上採集數據。這依賴於電源總是比其他設備反應慢得多,通常情況不是這樣。

-multiprocessing/threading - 我一直在閱讀關於SO和python.org的這個問題,但我還不清楚這是否能完成我想要的功能。我試圖測試它,但是我發現它很難編碼,如果它不在我想要的位置附近,我不想再投入更多時間。

所以,簡而言之:多處理會做我想要的嗎?有沒有其他方法可以做到這一點?

+2

你可以看看扭曲:[TwistedMatrix](http://twistedmatrix.com/trac/) – 2012-07-10 23:33:09

+0

扭曲的方式很酷,但從事情的聲音一個簡單的線程應該罰款。你沒有說任何關於通信發生的事情(http,socket,還有其他的東西?)。這可能會影響你的解決方案 – 2012-07-10 23:35:53

+1

只是標準線程應該可以正常工作......不需要任何花哨 – 2012-07-10 23:37:31

回答

1

看起來你想要一個簡單的線程模型,在那裏你爲你想要在後臺執行的任務(電源切換或數據獲取)創建一個線程。這裏有一個例子(未經測試的代碼):

from threading import Thread                      

def take_data(): 
    while 1:                    
     data = go_fetch_more_data() 

data_thread = Thread(target=take_data) 
data_thread.start() 

while 1: 
    sleep_seconds = random.randint(0, 60)   
    time.sleep(sleep_seconds) 
    toggle_power() 

注意 - 使用這種方法停止程序的唯一方法是殺死它。如果您需要監視某種關機信號,則必須爲每個關機信號創建一個線程。然後,你會想要一個優雅的方式來關閉每個線程。我會舉一個例子,但我並不完全清楚Python的最佳實踐。

1

如果您希望在Python或大多數編程語言中同時發生兩件事情,那麼請使用線程。這就是他們的目的。 Here是一個關於如何在Python中進行線程化的教程。

一個線程將切換功率,另一個將獲取數據。

3

想不到任何理由我不會把它們寫成兩個完全獨立的腳本,因爲它們不需要任何狀態共享。

+0

他可以製作第三個啓動兩個腳本! – 2012-07-11 00:25:29

+0

是的,或者只是一個簡單的批處理文件/ shell腳本。 – kindall 2012-07-11 01:33:36

+0

我不確定我是否可以完成這項工作。我正在使用由其他人創建的迭代器,它做了一些我無法理解的事情。我必須嚴格地堅持一定的結構,否則我會從迭代器中得到錯誤。我很抱歉,這些陳述非常模糊,但這是我的知識水平。 – Annie 2012-07-11 02:03:57

0

asyncoro支持與協程的異步事件處理。使用asyncoro進行編程與線程非常相似,除了對異步完成使用「yield」。您的問題可以用

import asyncoro, random 

def collect(coro=None): 
    while True: 
     # collect data every 10 seconds? 
     yield coro.sleep(10) 
     data = read_data() 

def toggle(coro=None): 
    while True: 
     yield coro.sleep(random.randint(10,30)) 
     toggle_power() 

collector = asyncoro.Coro(collect) 
toggler = asyncoro.Coro(toggle) 

實現,而線程是足夠的這個特殊的任務,asyncoro框架提供了許多功能,包括並行,分佈式,容錯的編程支持。我懷疑,鑑於問題的領域,與消息(通道或與協程的點對點通信)進行通信可能對您有用。