[英]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,请看这个答案 :
但是,要查看
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.