我习惯于多处理,但现在我有一个问题,mp.Pool
不是我需要的工具
我有一个准备输入的过程和另一个使用它的过程。我没有用完所有的内核,所以我想让这两个内核同时运行,第一个让批处理为下一次迭代做好准备。我该怎么做?(重要的是)这种东西叫什么,这样我就可以用谷歌搜索它了
这里有一个虚拟的例子。以下代码需要8秒钟:
import time
def make_input():
time.sleep(1)
return "cthulhu r'lyeh wgah'nagl fhtagn"
def make_output(input):
time.sleep(1)
return input.upper()
start = time.time()
for i in range(4):
input = make_input()
output = make_output(input)
print(output)
print(time.time() - start)
CTHULHU R'LYEH WGAH'NAGL FHTAGN
CTHULHU R'LYEH WGAH'NAGL FHTAGN
CTHULHU R'LYEH WGAH'NAGL FHTAGN
CTHULHU R'LYEH WGAH'NAGL FHTAGN
8.018263101577759
如果我在做输出的同时准备输入批次,则需要四秒钟。大概是这样的:
next_input = make_input()
start = time.time()
for i in range(4):
res = do_at_the_same_time(
output = make_output(next_input),
next_input = make_input()
)
print(output)
print(time.time() - start)
但是,很明显,这是行不通的。我怎样才能完成我想要完成的事情
重要提示:我尝试了以下方法,但失败了,因为执行工作人员在错误的范围内工作(例如,对于我的实际用例)。在我的虚拟用例中,它不起作用,因为它在不同的过程中打印
def proc(i):
if i == 0:
return make_input()
if i == 1:
return make_output(next_input)
next_input = make_input()
for i in range(4):
pool = mp.Pool(2)
next_input = pool.map(proc, [0, 1])[0]
pool.close()
所以我需要一个解决方案,其中第二个进程与for循环发生在相同的范围或环境中,并且第一个进程具有可以从该范围获得的输出
您应该能够使用
Pool
。如果我理解正确,您希望一个worker为下一个worker准备输入,该worker运行并执行更多操作,鉴于您的示例函数,这应该做到:我们准备了一个包含2个工人的池,现在我们希望运行循环来运行两次这对任务
我们使用等待函数完成的^{} 将
make_input
委托给工作者,并将结果分配给next_input
。注意:在本例中,我们可以使用单个工作池,只运行next_input = make_input()
(即,在脚本运行的同一进程中,只委托make_output()
)现在更有趣的一点是:通过使用^{} ,我们要求工作程序运行
make_output
,将单个参数next_input
传递给它,并告诉它运行(或任何函数)print
,将make_output
的结果作为参数传递给注册为callback
的函数然后我们^{} 使池不再接受任何作业,并^{} 等待进程完成其作业
相关问题 更多 >
编程相关推荐