python starmap_python-使用multiprocessing.starmap()在进程之间共...

我想使用multiprocessing.Value multiprocessing.Lock在单独的进程之间共享一个计数器.例如:

import itertools as it

import multiprocessing

def func(x, val, lock):

for i in range(x):

i ** 2

with lock:

val.value += 1

print('counter incremented to:', val.value)

if __name__ == '__main__':

v = multiprocessing.Value('i', 0)

lock = multiprocessing.Lock()

with multiprocessing.Pool() as pool:

pool.starmap(func, ((i, v, lock) for i in range(25)))

print(counter.value())

这将引发以下异常:

RuntimeError: Synchronized objects should only be shared between

processes through inheritance

我最困惑的是,一个相关的(虽然不是完全相似的)模式可以与multiprocessing.Process()一起使用:

if __name__ == '__main__':

v = multiprocessing.Value('i', 0)

lock = multiprocessing.Lock()

procs = [multiprocessing.Process(target=func, args=(i, v, lock))

for i in range(25)]

for p in procs: p.start()

for p in procs: p.join()

现在,我认识到这是两个明显不同的事物:

>第一个示例使用了多个等于cpu_count()的工作进程,并在它们之间分割了一个可迭代范围(25)

>第二个示例创建25个工作流程和任务,每个工作流程和任务只有一个输入

就是说:如何以这种方式与pool.starmap()(或pool.map())共享实例?

我已经看到过类似的问题here、here和here,但是这些方法似乎不适用于.map()/.starmap(),因为Value是否使用ctypes.c_int都是如此.

我意识到这种方法在技术上是可行的:

def func(x):

for i in range(x):

i ** 2

with lock:

v.value += 1

print('counter incremented to:', v.value)

v = None

lock = None

def set_global_counter_and_lock():

"""Egh ... """

global v, lock

if not any((v, lock)):

v = multiprocessing.Value('i', 0)

lock = multiprocessing.Lock()

if __name__ == '__main__':

# Each worker process will call `initializer()` when it starts.

with multiprocessing.Pool(initializer=set_global_counter_and_lock) as pool:

pool.map(func, range(25))

这真的是最佳做法吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值