Python 多处理实现简单计数器的简便方法?

标签 python multiprocessing

大家好,我现在在 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

所以如果没有外部锁,你可能会遇到以下情况:

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

关于Python 多处理实现简单计数器的简便方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1233222/

相关文章:

python - 为什么 multiprocessing.Process.join() 挂起?

Python--从一个非空的multiprocessing.Queue中获取Queue.Empty异常

python - BrokenProcessPool 关于在 cross_val_score 中使用 n_jobs 参数

python - 列表索引超出范围

Python - 对多个进程使用相同的双工 Pipe()

Python - 如何在多个进程之间共享大型数据集?

python - 使用 python 3.6.2 CPU 的 Windows 上出现 "import tensorflow"错误

python - Try 和 except 都在被另一个函数调用时执行

python - 在 pywinauto 上查找 Elements 问题

python - 使用 TSNE 的词嵌入可视化不清楚