1
我正在使用python多进程。使用Pool启动并发进程,使用RawArray在并发进程之间共享数组。我不需要同步RawArray的访问,也就是说,可以随时通过任何进程修改数组。RawArray未被进程修改为Python多处理的共享内存
为RawArray测试代码是:(不介意程序的意义,因为它仅仅是一个测试。)
from multiprocessing.sharedctypes import RawArray
import time
sieve = RawArray('i', (10 + 1)*[1]) # shared memory between processes
import multiprocessing as mp
def foo_pool(x):
time.sleep(0.2)
sieve[x] = x*x # modify the shared memory array. seem not work ?
return x*x
result_list = []
def log_result(result):
result_list.append(result)
def apply_async_with_callback():
pool = mp.Pool(processes = 4)
for i in range(10):
pool.apply_async(foo_pool, args = (i,), callback = log_result)
pool.close()
pool.join()
print(result_list)
for x in sieve:
print (x) # !!! sieve is [1, 1, ..., 1]
if __name__ == '__main__':
apply_async_with_callback()
虽然如预期的代码没有工作。我评论了关键的陈述。我已经陷入了这一整天。任何帮助或建设性意见将不胜感激。
Karlila,感谢您的时间。我刚刚重新编写了代码。现在共享内存筛仍然没有修改(它是[1,1,...])。我错过了什么?更清楚的是,我的问题是如何在并发进程中修改共享数组(RawArray)而不在每个进程中复制它? – user3349785
@ user3349785在答案中增加了一件事。请注意,顺便说一下,您不应该以使现有答案无效的方式更改问题。 –
对不起,我改变了这个问题(我第一次错了一些代码,只是想让问题更清楚,实际上这是我第一次问这个问题,我不知道这个规则。)你的意思是“你的代码在每个子进程中创建一个新的筛子“?我没有将共享数组筛选函数传递给每个进程,只是在子进程foo_pool中通过“sieve [x] = x * x”修改了其中的一个元素。 – user3349785