在 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())次。如果我们更好地了解您要完成的任务,我们也许能够提出更好的解决方案,而不仅仅是在功能上锁定。

相关内容

  • 没有找到相关文章

最新更新