Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多处理和python_Python_Multiprocessing - Fatal编程技术网

多处理和python

多处理和python,python,multiprocessing,Python,Multiprocessing,我有以下代码 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 =

我有以下代码

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))
输出将是
results=[3,5,7]
。并打印出
15
。 这样,如果我想计算
结果之和
,我需要保存整个列表
结果
。 有没有一种方法可以在不保存整个列表的情况下使用多处理?例如,在使用mulprocessing时对
结果进行求和。因为如果我的列表
a
b
变得超长,那么输出的
结果
将占用太多内存,无法放入我的笔记本电脑中。 换句话说,我的目标是在不保存整个列表的情况下获得
sum(results)
,但同时加快过程


谢谢你

当进程在一个自包含的环境中运行时,你肯定会少担心一些事情:)。如果需要,可以使用
队列
对象以这种方式修改单个变量以实现进程间通信

从itertools导入重复
从多处理导入进程,队列
导入操作系统
将numpy作为np导入
a=[1,2,3]
b=[2,3,4]
def多重运行包装器(参数):
返回添加(*args)
def添加(队列,x,y):
queue.put(queue.get(block=True)+x+y)
如果名称=“\uuuuu main\uuuuuuuu”:
队列=队列()
queue.put(0)
进程=[]
processs=[Process(target=add,args=(queue,x,y)),用于zip中的x,y(a,b)]
对于每个进程:
each.start()
对于每个进程:
each.join()
打印(queue.get(block=True))#打印15
queue.close()
queue.join_thread()
  • 如果您想使用
从itertools导入重复
从多处理导入池,队列
导入操作系统
将numpy作为np导入
a=[1,2,3]
b=[2,3,4]
def多重运行包装器(参数):
返回添加(*args)
def添加(x,y):
queue.put(queue.get(block=True)+x+y)
如果名称=“\uuuuu main\uuuuuuuu”:
队列=队列()
queue.put(0)
池=池(os.cpu\u count())
pool.starmap(add,zip(a,b))
打印(queue.get(block=True))
queue.close()
queue.join_thread()
  • 在这里,您不是存储每个流程的整个输出列表,而是与要修改的每个流程进行通信
  • 提出了一个快速解决方案,但还没有测试过

感觉Map/Reduce()可以满足您的需要。它是为大型数据集而构建的。“这个问题基本上与另一个问题问的是同一件事吗?”:不是。请确保在以重复的形式结束问题之前。@AvidJoe是的,它是。链接的问题是关于一个迭代星图,或者换句话说是一个“不保存整个列表”的星图。迭代星图是用于求和还是显示进度无关紧要。FWIW,进度条对元素计数进行内部求和。请确保在质疑复制品时提供不合适的原因。@MisteMiyagi。我是新来的,不知道如何看待这些帖子,但我觉得这个链接解释了我想说的。我想是吧。因此,如果op只是阅读链接的问题,他应该去tqdm并理解“进度条对元素计数进行内部求和。”甚至开始理解发生了什么?@AvidJoe他们应该看到另一个问题归结为迭代星图,这就是他们所问的问题。类似于第二个链接中的明喻,他们问“如何在
2*13
中实现
*
”,另一个问题问“如何在
4.5*27.3
中实现
*
”。