为什么我的打印函数(在 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
这真的很奇怪。结果不同,但两者都不是我想要的。
谁能帮我找到我的程序中的问题在哪里。多谢
多处理模块使用fork生成子进程以实现并行性。 Windows没有实现fork,并且在Windows上对它的Python仿真是不完整的。 缺少的效果之一是stdout
(由print()
使用(不被子进程继承。 相反,子进程使用默认stdout
。
这在命令窗口中工作正常,因为它使用默认stdout
。 这在Spyder中没有显示任何内容,因为使用不同的管道输出到Spyder IPython控制台窗口。
请参阅此问题("Spyder 中的简单多处理函数不输出结果"(和此答案以获取更多详细信息和可能的缓解措施。