Python多处理简单的方法来实现一个简单的计数器?

9 python multiprocessing

嘿大家,我现在在python中使用多处理.而我只是想知道是否存在某种简单的计数器变量,每个进程在完成处理某个任务时可能只是递增(有点像总共完成了多少工作).

我查找了API for Value,不要认为它是可变的.

Eli*_*ght 24

Value确实是可变的; 您可以从ctypes模块中指定所需的数据类型,然后可以对其进行更改.这是一个完整的,有效的脚本,用于演示:

from time import sleep
from ctypes import c_int
from multiprocessing import Value, Lock, Process

counter = Value(c_int)  # defaults to 0
counter_lock = Lock()
def increment():
    with counter_lock:
        counter.value += 1

def do_something():
    print("I'm a separate process!")
    increment()

Process(target=do_something).start()
sleep(1)
print counter.value   # prints 1, because Value is shared and mutable
Run Code Online (Sandbox Code Playgroud)

编辑:Luper在下面的评论中正确地指出Value默认情况下锁定值.这是正确的,即使赋值包含多个操作(例如分配可能包含许多字符的字符串),这个赋值也是原子的.但是,当递增计数器时,您仍然需要我的示例中提供的外部锁,因为递增加载当前值然后递增它然后将结果分配回Value.

因此,如果没有外部锁定,您可能会遇到以下情况:

  • 进程1(原子地)读取计数器的当前值,然后递增它
  • 在进程1可以将递增的计数器分配回之前Value,发生上下文切换
  • 进程2(原子地)读取计数器的当前(未增加的)值,使其递增,并将递增的结果(原子地)返回到 Value
  • 过程1分配其增量值(原子地),吹走过程2执行的增量

  • 默认情况下,值访问受Lock保护. (2认同)