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

时间:2016-01-29 15:29:59

标签: python multithreading

我正在创建threading.Timer(2,work)个运行线程。在每个工作函数内部,在某些条件下,全局计数器必须在没有冲突的情况下增加,以便在生成的工作线程中访问计数器变量。

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

此前有人问过这里的问题:Python threading. How do I lock a thread?

2 个答案:

答案 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