我是多处理的初学者,任何人都可以告诉我为什么这不会产生任何输出?
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()
答案 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:
但是,要查看
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()