2013-03-26 48 views
4

我正在寫一個令牌環局域網的模擬,並試圖在一個單獨的線程中運行一個定時器到我的主程序來檢查超時接收「活動狀態「從顯示器上。我在其他節點之前啓動監視器程序,它們在發送和「活動狀態」之前都有相同的等待時間,或者開始選擇新的監視器,但節點程序似乎在監視器之前超時。併發程序中的Python time.time()可靠性

這只是在python中的併發問題還是更可能是我的代碼問題?

這裏是一個線程運行,如果你需要更多的信息只是問

def timer(): 
    global reset 
    global ismonitor 
    global mToSend 
    global dataToSend 
    reset = time.time() 
    send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    while 1: 
     timer = time.time() 
     elapsed = timer - reset 
     if elapsed > 5: 
      if ismonitor: 
       mToSend = "110000" ## send around a token with a monitor alive flag on the broadcast channel 
       mToSend += maddr 
       dataToSend = True 
       reset = time.time() 
      else: 
       holdelection() 
       reset = time.time() 

回答

1

由於Python的全局解釋鎖功能(GIL)線程永遠不會同時執行。相反,一個線程獲得一段執行時間,而所有其他線程都被鎖定(它們不執行任何代碼)。這就是爲什麼time.time()的調用只與分配給線程的最小時間片一樣精確的原因。

看看David Beazley的工作以更好地理解線程在Python中的工作方式:http://www.dabeaz.com/GIL/他表明,根據您使用的Python版本,線程可以在被重新獲取GIL之前被阻塞幾秒鐘。在這種情況下,您的time.time()調用將會等待相當長的時間。

如果你想要更高的精度,你應該考慮使用進程而不是線程。在多處理模塊的幫助下,它們並不比使用Python中的線程更復雜:http://docs.python.org/3.3/library/multiprocessing.html

+0

我知道它們沒有正確的併發,但希望它不會太多的問題,看起來我是錯誤。感謝您的鏈接和答案,我會看看使用流程,看看它是如何發展的。 – Cob50nm 2013-03-26 11:19:09