【问题标题】:Why don't I get concurrent execution?为什么我没有得到并发执行?
【发布时间】:2015-10-13 23:26:28
【问题描述】:

考虑以下最小程序:

#!/usr/bin/env python3

import time
from multiprocessing import Process

def mp_test():
    time.sleep(3)
    print('mp_test')

print('start')
p = Process(target=mp_test)
p.run()
print('end')

根据我对documentation for the multiprocessing module的理解,这段代码应该在单独的进程中执行mp_test(),也就是说应该和主进程并行执行。因此,我希望得到以下输出:

start
end
mp_test

但是,我得到的实际输出是这样的:

start
mp_test
end

这是为什么?我需要进行哪些更改才能获得预期的结果?

【问题讨论】:

  • p.run() 是阻塞调用
  • 尝试使用 "import os print 'process id:', os.getpid()" 看看你是否真的得到了 2 个线程,如果是,请检查阻塞调用

标签: python python-3.x python-multiprocessing


【解决方案1】:

尝试p.start() 而不是p.run()

【讨论】:

    【解决方案2】:

    根据文档:

    在多处理中,进程是通过创建一个 Process 对象然后调用它的 start() 方法来产生的。

    所以看来你应该调用p.start(),然后它会在一个单独的线程中调用p.run(),这应该会给出你想要的结果。

    调用p.run()直接跳过整个多线程位。

    【讨论】:

    • 谢谢。不知何故,我未能从文档中收集到这一点。
    • 等等。你不需要 p.start() 和 p.run() 是吗?只是 p.start() 我想。此外,由于它将在不同的进程中运行,您可能看不到输出。如果你想作为一个线程运行,那么from multiprocessing.dummy import Process 将它作为一个单独的线程运行。然后您应该会看到输出,因为它应该共享相同的标准输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2013-07-15
    • 2015-06-03
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多