我需要編寫運行兩個線程一個簡單的應用程序: - 線程1:運行在一定的時間週期,假設每1分鐘 - 線程2:只是一個「正常的」,而真正的循環,它「東西」扭曲的線程...如何正確使用它們?
如果不能在一定的時間間隔運行的要求我會在扭曲沒有看過,而是簡單的睡眠(60)不夠好和施工,如:
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.run()
看起來很簡單的實現我想要的東西有。
現在,我該如何'正確地'添加另一個線程?
在這裏我看到兩個選項:
- 使用線程庫和運行兩個「蟒蛇線程的一個執行我的while循環,和其他正在運行的reactor.run()。但谷歌似乎反對這種方法,並建議使用扭絞線程
- 使用扭曲線程。這是我試過的,但不知何故,這對我來說看起來有點笨拙。
這就是我想出了:
def timed_thread():
print 'i will be called every 1 minute'
return
def normal_thread():
print 'this is a normal thread'
time.sleep(30)
return
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.callInThread(normal_thread)
reactor.run()
,似乎工作,但!我無法停止該應用程序。如果我按下^ C它不會做任何事情(沒有'callInThread'它只會停止,因爲你會期望它)。^Z炸彈出殼,如果我然後'殺死%1'似乎殺死進程(殼報告),但'正常'線程繼續運行。殺PID不會消除它,唯一的治療方法是殺死-9。真奇怪。
所以。我究竟做錯了什麼?在扭曲中實現兩個線程是否正確?我不應該打擾扭曲?還有哪些其他「標準」替代方案可以實現定時呼叫? ('標準'我的意思是我可以easy_install或yum安裝它們,我不想開始下載並使用隨機網頁中的一些隨機腳本)。
您可以非常小心地使用扭曲的線程(以及一般的python)。你的「主」在做什麼?一個頻繁使用的情況是作爲協議客戶端/服務器,請求或監聽請求。反應堆將處理這些請求,並假設它們是非阻塞的,將能夠在特定時間間隔內啓動特定功能。 – MattH 2010-02-11 09:39:40
線程的危險在於,如果您不小心,一個線程可能會在數據被另一個線程使用時修改數據,從而導致不可預知的行爲。 – MattH 2010-02-11 09:44:32
所有的'main'只是爲了激發這兩個線程(事實上它只有4行,你可以在示例中看到),但這兩個函數都有點複雜,但在處理方面沒有什麼不尋常的地方,只是檢查它,但這並不重要)。這兩個線程不共享任何數據btw – rytis 2010-02-11 09:45:10