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值仍然存在。谁能指出我正确的方向?
答案 0 :(得分:1)
查看此答案:https://stackoverflow.com/a/4542436/1542000
保证线程安全的唯一可靠方法是在函数内部使用某种锁定机制:
lock = threading.Lock()
lock.acquire()
...
lock.release()
这样可以使两个线程不会同时访问字典,从而消除竞争条件。
很难说出你的setCmdId函数发生了什么,特别是因为看起来for循环只是重复命令len(cmdidDict.items())
次。如果我们更清楚你想要实现的目标,我们可能能够提出一个更好的解决方案,而不仅仅是在锁定函数上。