为什么我的打印功能(在多处理中)什么都不打印?

时间:2017-08-09 09:44:45

标签: python multiprocessing spyder

为什么我的打印功能(在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

真的很奇怪。结果不同,但两者都不是我想要的。

任何人都可以帮我找到程序中的问题所在。非常感谢

1 个答案:

答案 0 :(得分:1)

多处理模块使用 fork 生成子进程以实现并行性。 Windows没有实现 fork ,并且在Windows上对其的Python仿真还不完整。缺少的影响之一是子进程未继承stdout(由print()使用)。相反,子进程使用默认的stdout

这在命令窗口中很好用,因为它使用默认的stdout。这在Spyder中什么也没有显示,因为使用了另一个管道来输出到Spyder IPython控制台窗口。

请参见this question(“ Spyder中的简单多处理功能不会输出结果”)和this answer,以获取更多详细信息和可能的缓解措施。