2017-02-10 94 views
-1

有人能告訴我在哪裏可以把鎖定在python自定義線程內?線程在自定義線程上鎖定python

import threading 
lock = threading.Lock() 

class WorkerThread(threading.Thread): 
    def __init__(self,lock): 
     super(WorkerThread,self).__init__() 
     self.lock = lock 
    def run(self): 
     self.lock.acquire() 
     print "Hello World" 
     self.lock.release() 


worker = WorkerThread(lock) 

錯誤回溯:

Traceback (most recent call last): 
    File "<buffer>", line 14, in <module> 
    File "<buffer>", line 11, in __init__ 
AssertionError: release() of un-acquire()d lock 
+1

你可以讓你的生活使用鎖作爲一個上下文管理器觸摸更容易(和安全一般情況下)。你可以用'with self.lock:'替換acquire和release,並且在獲取鎖的同時運行該塊下面的所有內容,並在塊結束時釋放它。 –

回答

1

您已經混合製表符和空格。大多數run定義實際上是嵌套在__init__self.lock.release()實際上是外run和內部__init__。您的線程最終嘗試釋放線程創建時解鎖的鎖。

不要混合使用製表符和空格。堅持空間。在編輯器中打開「顯示空白」以使問題更加明顯,如果編輯無法做到這一點,可以獲得更好的編輯器。使用-tt標誌運行Python也可以幫助捕獲這些錯誤。