我有以下代码。
from itertools import repeat
from multiprocessing import Pool
import os
import numpy as np
a=[1,2,3]
b=[2,3,4]
def multi_run_wrapper(args):
return add(*args)
def add(x,y):
return x+y
if __name__ == "__main__":
pool = Pool( os.cpu_count())
results = pool.starmap(add,zip(a,b))
print(sum(results))
则输出将是CCD_ 1。并打印出CCD_ 2。这样,如果我想计算results
的和,我需要保存整个列表results
。有没有一种方法可以在不保存整个列表的情况下使用多处理?例如,在使用多重处理时对results
求和。因为如果我的列表a
和b
变得超长,那么输出results
将占用太多内存,并且无法放入我的笔记本电脑。换句话说,我的目标是在不保存整个列表的情况下获得sum(results)
,但同时加快进程。
谢谢
当进程在一个自包含的环境中运行时,您肯定会少担心一些事情:(。如果需要,可以使用results= [3, 5, 7]
0对象以这种方式修改单个变量,以实现进程间通信。
from itertools import repeat
from multiprocessing import Process, Queue
import os
import numpy as np
a=[1,2,3]
b=[2,3,4]
def multi_run_wrapper(args):
return add(*args)
def add(queue,x,y):
queue.put(queue.get(block=True)+x+y)
if __name__ == "__main__":
queue = Queue()
queue.put(0)
processes = []
processes = [Process(target=add,args=(queue,x,y)) for x,y in zip(a,b)]
for each in processes:
each.start()
for each in processes:
each.join()
print(queue.get(block=True)) # prints 15
queue.close()
queue.join_thread()
- 如果要使用
Pool
from itertools import repeat
from multiprocessing import Pool, Queue
import os
import numpy as np
a=[1,2,3]
b=[2,3,4]
def multi_run_wrapper(args):
return add(*args)
def add(x,y):
queue.put(queue.get(block=True)+x+y)
if __name__ == "__main__":
queue = Queue()
queue.put(0)
pool = Pool( os.cpu_count())
pool.starmap(add,zip(a,b))
print(queue.get(block=True))
queue.close()
queue.join_thread()
- 这里不是存储每个进程的输出的整个列表,而是与每个进程通信,在哪里进行修改
- 想出了一个快速的解决方案,但还没有测试