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

标签 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

真的很奇怪。结果不一样,但都不是我想要的。

谁能帮我找出程序中的问题所在。非常感谢

最佳答案

多处理模块使用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/

相关文章:

Python 内置目录不一致

Python的多线程代码比单线程慢

python - 将不相等的数据框与所有值合并

windows - "system"的 Perl Windows 替代品(打开多个进程)

python - 无法将 .xlsx 导入 Python : No such file or directory

python - 为什么 Spyder 不获取全局变量?

python - Django 持久数据库连接 - 一种不同的方法

python - 使用 pool.imap 时无法 pickle psycopg2.extensions.connection 对象,但可以在单个进程中完成

python - 在 Pool.map 中使用生成器作为可迭代是否合理

python - 您缺少依赖项! # 强制 : spyder_kernels >=2. 0.1,<2.1.0 : 2. 0.1 (挪威克朗)