在Python中,如何使两种不同的事情同时发生?

2024-05-14 01:11:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我习惯于多处理,但现在我有一个问题,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循环发生在相同的范围或环境中,并且第一个进程具有可以从该范围获得的输出


Tags: forinputoutputmakereturntime过程start
1条回答
网友
1楼 · 发布于 2024-05-14 01:11:27

您应该能够使用Pool。如果我理解正确,您希望一个worker为下一个worker准备输入,该worker运行并执行更多操作,鉴于您的示例函数,这应该做到:

pool = mp.Pool(2)
for i in range(4):
    next_input = pool.apply(make_input)
    pool.apply_async(make_output, (next_input, ), callback=print)
pool.close()
pool.join()

我们准备了一个包含2个工人的池,现在我们希望运行循环来运行两次这对任务

我们使用等待函数完成的^{}make_input委托给工作者,并将结果分配给next_input。注意:在本例中,我们可以使用单个工作池,只运行next_input = make_input()(即,在脚本运行的同一进程中,只委托make_output()

现在更有趣的一点是:通过使用^{},我们要求工作程序运行make_output,将单个参数next_input传递给它,并告诉它运行(或任何函数)print,将make_output的结果作为参数传递给注册为callback的函数

然后我们^{}使池不再接受任何作业,并^{}等待进程完成其作业

相关问题 更多 >