2010-01-23 91 views
1

如果我打電話Python中的Timer如何工作,關於多線程?

Timer(.1, some_function, [some_arguments]).start() 

多次,到底發生了什麼幕後?

我們的問題的根源是...

我們有本質上是一個方法:

def move(target): 
force = calculateForce(target-getCurrentPosition()) 
if(force != 0) 
    setForce(force) 
    Timer(.1, moveCursor, [tx]).start() 
else: 
    setForce(0) 

設置效力以後,我們需要一定的時間是否應該經過檢查停止。 (這些信息來自外部物理設備,不會觸發事件。)

這個函數需要多長時間纔會出現奇怪的問題,並且我們還得到了「無法啓動新線程」的錯誤經過一段時間後。

這使我相信Timer(...)不會重用線程,但每次都會創建一個新線程。

與信念,我們正在使用的庫不是線程安全相結合,這些錯誤會使得一些感覺....

回答

3

右:每次調用Timer並啓動一個新的線程。的確,類threading.Timer記錄爲爲「一個線程」。您可以通過閱讀the source code證實了這一點,線707

一個很好的替代方案是在單個線程中運行scheduler,通過Queue.Queue實例(本線程)接收請求和本質它們序列化(也可以照顧你「非線程安全庫」問題,而不需要進一步的鎖定或同步,這取決於你如何安排你的整體架構)。