为什么我的打印函数(在 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 控制台窗口。
参见 this question (“Spyder 中的简单多处理函数不输出结果”)和 this answer了解更多详细信息和潜在的缓解措施。
关于python - 为什么我的打印功能(在多处理中)什么都不打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587101/