使用多处理的Process没有输出

时间:2016-06-01 17:22:19

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

我是多处理的初学者,任何人都可以告诉我为什么这不会产生任何输出?

import multiprocessing

def worker(num):
    """thread worker function"""

    print('Worker:', num)

if __name__ == '__main__':
    jobs = []

    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

2 个答案:

答案 0 :(得分:2)

您正在启动Process(),但从不等待它完成,因此您的程序执行在后台进程完成之前结束。试试这个,拨打Process.join()

import multiprocessing
import sys

def worker(num):
    """thread worker function"""

    print('Worker:', num)
    sys.stdout.flush()

if __name__ == '__main__':
    jobs = []

    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    map(lambda p: p.join(), jobs)

我们使用map()join()列表中的每个流程上调用jobs

以下是此工作的一个示例:

In [127]: %paste
import multiprocessing
import sys

def worker(num):
    """thread worker function"""

    print('Worker:', num)
    sys.stdout.flush()

if __name__ == '__main__':
    jobs = []

    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    map(lambda p: p.join(), jobs)

## -- End pasted text --
Worker: 2
Worker: 1
Worker: 0
Worker: 3

In [128]:

至于为何在IDLE工作,请参阅this answer

  

但是,要查看print输出,至少在Windows上,必须从控制台启动IDLE。

C:\Users\Terry>python -m idlelib
hello bob
     

(在2.x上使用idlelib.idle。原因是IDLE在单独的进程中运行用户代码。目前,IDLE进程和用户代码进程之间的连接是通过套接字实现的。多处理完成的fork不会复制或继承套接字连接。当通过图标或资源管理器(在Windows中)启动IDLE时,打印输出无处可去。从具有python(而不是pythonw)的控制台启动时,输出将转到控制台,如上所述。

答案 1 :(得分:1)

您可能需要刷新输出。您可以使用sys.stdout.flush()

import multiprocessing
import sys

def worker(num):
    """thread worker function"""
    print('Worker:', num)
    sys.stdout.flush()
    return

if __name__ == '__main__':
    jobs = []
    for i in range(4):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()