大家好,我现在在 python 中使用多处理。我只是想知道是否存在某种简单的计数器变量,每个进程在完成处理某些任务时可以增加(有点像总共完成了多少工作)。
我查找了 Value 的 API,不认为它是可变的。
大家好,我现在在 python 中使用多处理。我只是想知道是否存在某种简单的计数器变量,每个进程在完成处理某些任务时可以增加(有点像总共完成了多少工作)。
我查找了 Value 的 API,不认为它是可变的。
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
编辑:Luper 在下面的评论中正确指出Value
默认情况下值是锁定的。这是正确的,即使一个赋值由多个操作组成(例如赋值一个可能有很多字符的字符串),那么这个赋值也是原子的。但是,当递增计数器时,您仍然需要我的示例中提供的外部锁,因为递增加载当前值,然后递增它,然后将结果分配回Value
.
所以如果没有外部锁,你可能会遇到以下情况:
Value
,发生上下文切换Value