我正在创建threading.Timer(2,work)
个运行线程。在每个工作函数内部,在某些条件下,全局计数器必须在没有冲突的情况下增加,以便在生成的工作线程中访问计数器变量。
我已尝试Queue.Queue
已分配的计数器以及threading.Lock()
。这是实现线程安全的全局增量变量的最佳方法。
此前有人问过这里的问题:Python threading. How do I lock a thread?
答案 0 :(得分:14)
不确定您是否已经尝试过这种特定的语法,但对我而言,这一直都很有效:
定义全局锁定:
import threading
threadLock = threading.Lock()
然后,每次在各个线程中增加计数器时,您必须获取并释放锁定:
with threadLock:
global_counter += 1
答案 1 :(得分:3)
最简单的解决方案是使用multiprocessing.Lock
来保护计数器。我喜欢把它放在课堂上,如下:
from multiprocessing import Process, RawValue, Lock
import time
class Counter(object):
def __init__(self, value=0):
# RawValue because we don't need it to create a Lock:
self.val = RawValue('i', value)
self.lock = Lock()
def increment(self):
with self.lock:
self.val.value += 1
def value(self):
with self.lock:
return self.val.value
def inc(counter):
for i in range(1000):
counter.increment()
if __name__ == '__main__':
thread_safe_counter = Counter(0)
procs = [Process(target=inc, args=(thread_safe_counter,)) for i in range(100)]
for p in procs: p.start()
for p in procs: p.join()
print (thread_safe_counter.value())
以上代码段首先取自Eli Bendersky的博客here。