[英]changing global variables in threads in python
test_var="TEST"
class exLogging(logging.Logger):
cmdidDict[threading.currentThread()]="default"
def __init__(self, name):
logging.Logger.__init__(self, name)
cmdidDict[threading.currentThread()]="default"
return
def setCmdId(self, newCmdId): #threadsafe sync
for k,v in cmdidDict.items():
cmdidDict[threading.currentThread()]=newCmdId
test_var=newCmdId
obj=ContextFilter(test_var) #ContextFilter is another class
self.addFilter(obj)
self.info("in setcmdid")
我希望類中的setCmdId函數是線程安全的,因為將從各個線程分別調用此函數。 通過線程安全,我的意思是我希望setCmdId函數在每個不同的線程中以不同的方式設置CMDID的值,並且一旦線程結束,CMDID應該獲得其全局值。 CMDID和cmdidDict []是全局變量。 問題是CMDID值仍然存在。 誰能指出我正確的方向?
看看這個答案: https : //stackoverflow.com/a/4542436/1542000
確保線程安全的唯一肯定方法是在函數內部使用某種鎖定機制:
lock = threading.Lock()
lock.acquire()
...
lock.release()
這樣可以避免兩個線程同時訪問字典,從而消除競爭條件。
很難說出setCmdId函數中發生了什么,特別是因為看起來for循環只重復了len(cmdidDict.items())
次命令len(cmdidDict.items())
。 如果我們更好地了解您要完成的工作,我們可能會想出一個更好的解決方案,而不僅僅是對函數進行鎖定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.