gpt4 book ai didi

python - 无法使用池更改共享内存对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:21 24 4
gpt4 key购买 nike

<分区>

我正在玩 python 的 multiprocessing模块和共享内存。我可以将共享内存对象与 Process 一起使用,但不能与 Pool 一起使用。我为我的 Pool 添加了回调,但回调似乎也没有被调用。

from multiprocessing import Array, Pool, Process

def flip(x,a):
a[x] = 0 if a[x] else 1
return (x, a[x])

def cb(result):
print(result)

if __name__ == '__main__':

# size of array
N = 10

# shared array - N bytes - unsynchronized - initialized to zeros
a = Array('B', N, lock=False)

# flip values to ones using Process
processes = [Process(target=flip, args=(x, a)) for x in range(N)]
for p in processes: p.start()
for p in processes: p.join()
print([a[i] for i in range(N)])

# flip values back to zeros using Pool
pool = Pool(processes=4)
for x in range(N):
pool.apply_async(flip, args=(x, a), callback=cb)
pool.close()
pool.join()
print([a[i] for i in range(N)])

我希望我的共享数组以全 1 打印一次,然后由 callback 打印单行,然后再次以全 0 打印该数组,但得到的却是这个;

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

为什么 Pool 没有运行任务?

为了一个最小的例子,取出共享内存;

def f(x):
return x

def cb(result):
print('cb',result)

if __name__ == '__main__':

pool = Pool(processes=4)
pool.apply_async(f, range(10), callback=cb)
pool.close()
pool.join()

我希望它能在不同的行上打印数字 0 到 9,但它没有输出任何内容。

如果我用这个替换上面的 apply_sync 调用;

pool.apply_async(f, args=[10], callback=cb)

我得到输出

cb 10

[10] 替换为 range(10)[1,2,3][(1) ,(2),(3)]([1],[2],[3]) 不产生任何输出。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com