繁体   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