繁体   English   中英

使用多处理的Process没有输出

[英]No output from Process using 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()

您正在启动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()jobs列表中的每个进程上调用join()

以下是此工作的示例:

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,请看这个答案

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

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

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

您可能需要刷新输出。 您可以使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM