如何在 python 中创建一个线程安全的全局计数器

新手上路,请多包涵

我正在创建一个 threading.Timer(2,work) 运行线程。在每个工作函数内,在某些情况下,全局计数器必须递增,而不会在生成的工作线程之间访问计数器变量发生冲突。

我试过 Queue.Queue 分配的计数器以及 threading.Lock() 。这是实现线程安全的全局增量变量的最佳方式。

之前有人在这里提问: Python threading。如何锁定线程?

原文由 L.fole 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

不确定你是否已经尝试过这种特定的语法,但对我来说这一直很有效:

定义一个全局锁:

 import threading
threadLock = threading.Lock()

然后每次在单个线程中增加计数器时都必须获取和释放锁:

 with threadLock:
    global_counter += 1

原文由 mommermi 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题