为什么我的打印功能(在python多进程中)什么都不打印?
from multiprocessing import Process, Queue
import os, time, random
def write(q):
print('Process to write: %s' % os.getpid())
for value in ['A', 'B', 'C']:
print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())
def read(q):
print('Process to read: %s' % os.getpid())
while True:
value = q.get(True)
print('Get %s from queue.' % value)
if __name__=='__main__':
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
print('start')
pr.start()
pw.join()
pr.terminate()
print('end')
我在spyder上运行它(Windows 10系统)。
我在Spyder的IPython控制台上的结果:
runfile('C:/Users/Dust/Desktop/programs/crawl/test.py', wdir='C:/Users/Dust/Desktop/programs/crawl')
start
end
Spyder的Python控制台结果:
>>> runfile('C:/Users/Dust/Desktop/programs/crawl/test.py', wdir='C:/Users/Dust/Desktop/programs/crawl')
start
Process to write: 12824
Put A to queue...
Put B to queue...
Put C to queue...
end
真的很奇怪。结果不同,但两者都不是我想要的。
任何人都可以帮我找到程序中的问题所在。非常感谢
答案 0 :(得分:1)
多处理模块使用 fork 生成子进程以实现并行性。 Windows没有实现 fork ,并且在Windows上对其的Python仿真还不完整。缺少的影响之一是子进程未继承stdout
(由print()
使用)。相反,子进程使用默认的stdout
。
这在命令窗口中很好用,因为它使用默认的stdout
。这在Spyder中什么也没有显示,因为使用了另一个管道来输出到Spyder IPython控制台窗口。
请参见this question(“ Spyder中的简单多处理功能不会输出结果”)和this answer,以获取更多详细信息和可能的缓解措施。