簡體   English   中英

在Python中更改線程中的全局變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM