我正在创建一个 threading.Timer(2,work)
运行线程。在每个工作函数内,在某些情况下,全局计数器必须递增,而不会在生成的工作线程之间访问计数器变量发生冲突。
我试过 Queue.Queue
分配的计数器以及 threading.Lock()
。这是实现线程安全的全局增量变量的最佳方式。
之前有人在这里提问: Python threading。如何锁定线程?
原文由 L.fole 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在创建一个 threading.Timer(2,work)
运行线程。在每个工作函数内,在某些情况下,全局计数器必须递增,而不会在生成的工作线程之间访问计数器变量发生冲突。
我试过 Queue.Queue
分配的计数器以及 threading.Lock()
。这是实现线程安全的全局增量变量的最佳方式。
之前有人在这里提问: Python threading。如何锁定线程?
原文由 L.fole 发布,翻译遵循 CC BY-SA 4.0 许可协议
一种解决方案是使用 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 的博客, 此处。
原文由 Michael Foukarakis 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
不确定你是否已经尝试过这种特定的语法,但对我来说这一直很有效:
定义一个全局锁:
然后每次在单个线程中增加计数器时都必须获取和释放锁: