2015-09-08 48 views
0

我想了解互斥鎖應用程序中的互斥鎖是如何工作的,但我有些疑惑。在我的情況下,我有從設備讀取的線程,寫入設備和同步線程的線程。在同步線程我有這種形式的計時器:Python多線程基本問題

def CheckConnection(self): 
     . . . 
      threading.Timer(1, self.CheckConnection).start() 

此計時器定期運行CheckConnection函數。

你能告訴我:

  1. 當線程被鎖定(收購)這意味着線程停止執行,並等待?這就像暫停?

  2. 當我啓動同步線程時,會發生什麼情況,我的checkConnection函數會執行並且定時器會在同步線程被鎖定後啓動......這將停止定時器並執行CheckConnection函數?

回答

0
  1. 的mymutex.acquire()調用將會阻塞線程調用它,直到互斥可用,則鎖定互斥(因此阻止任何其他線程調用哪個mymutex.acquire()),然後返回所以該線程可以繼續執行。調用mymutex.release()會釋放/解鎖互斥鎖,並且mymutex.acquire()上阻塞的最老的線程會鎖定互斥鎖並返回,即解除阻塞其他線程。
  2. Self.CheckConnection與def CheckConnection()中定義的函數相同嗎?所以你試圖讓CheckConnection函數每1調用一次(在你的情況下)秒?還有就是如何做到這一點的最多的回答這裏Python threading.timer - repeat function every 'n' seconds

使用互斥每個線程應該做這樣的事情一個很好的說明:

themutex.acquire() 
try: 
    print('Do some stuff') 
finally: 
    themutex.release() 

在一般情況下,獲取和釋放之間的代碼,即'做些什麼',應該儘可能快,因爲獲得互斥體的任何這些代碼段的最大持續時間也是另一個線程被阻塞的最大時間(除非多個線程被阻塞,延遲可能會變得更長)。

+0

使用'withuteutex:print('做一些東西')'有點短。 – BlackJack

+0

是的,同樣的東西,更短。關鍵是無論發生什麼(包括例外),發佈都必須被調用。 try/finally和clause都保證。 – barny

+0

感謝您的回答。 – Misiek777