【问题标题】:Multiprocessing in python doesnt print any statementspython中的多处理不打印任何语句
【发布时间】:2021-09-01 09:54:41
【问题描述】:

多线程正在打印输出,但不是多处理。搜索堆栈溢出并回答问题并没有解决问题。

多处理不工作。

from threading import Thread
import datetime
from multiprocessing import Process
import sys


import time

def func1():

    print('Working')
    time.sleep(5)
    global a
    a=10
    print(datetime.datetime.now())


def func2():
    print("Working")
    time.sleep(10)
    print(datetime.datetime.now())
    

p1 = Process(target=func1)
p1.start()
p2 = Process(target=func2)
p2.start()
p1.join()
p2.join()


print(a)

甚至 print(a) 也没有打印值。它说

NameError: name 'a' is not defined

【问题讨论】:

  • 变量不会在多处理进程之间移动(队列等除外)——这不可能按原样工作。你真正想做什么?
  • 已编辑问题请检查
  • 正如我所说,变量不会在进程之间传播。如果func1 正在另一个Python 进程中运行,它修改全局a 将不会出现在父进程中。 你想用多处理做什么?
  • 我刚刚检查了变量是否正在打印 bcz 以检查它是否执行
  • 连 func1 和 func2 里面的打印都不显示

标签: python multiprocessing python-multiprocessing python-multithreading


【解决方案1】:

正如我所评论的,普通变量,无论它们是否是全局变量,都不会神奇地在 multiprocessingProcesses 之间移动。 (嗯,实际上,这有点简化,取决于您使用的操作系统和多处理生成器,但我离题了。)

最简单的通信渠道是multiprocessing.Queue(实际上“神奇地”在进程之间工作)。

正如在进一步的 cmets 中所讨论的,

  • 您不能在执行前不保存脚本的 IDE 中使用 multiprocessing,因为它需要能够生成脚本的副本,并且如果磁盘上没有脚本,则不会生成任何内容.
  • 同样,您不能在 Jupyter 笔记本中很好地使用 multiprocessing,因为它们不是作为常规 Python 脚本运行的,而是通过 Python 内核进程 Jupyter 启动的。

这是您的代码的简单改编,可在进程之间实际传递数据。

记得用if __name__ == "__main__" 保护你的多处理main()

import datetime
import time
import multiprocessing


def func1(q: multiprocessing.Queue):
    print("func1 thinking...")
    time.sleep(2)
    q.put(("func1", 10))
    print("func1 quit at", datetime.datetime.now())


def func2(q: multiprocessing.Queue):
    for x in range(10):
        print("func2 working", x)
        q.put(("func2", x))
        time.sleep(0.3)


def main():
    queue = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=func1, args=(queue,))
    p2 = multiprocessing.Process(target=func2, args=(queue,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print("Subprocesses ended, reading their results...")
    while not queue.empty():
        print(queue.get())


if __name__ == "__main__":
    main()

输出是:

func1 thinking...
func2 working 0
func2 working 1
func2 working 2
func2 working 3
func2 working 4
func2 working 5
func2 working 6
func1 quit at 2021-06-16 17:58:46.542275
func2 working 7
func2 working 8
func2 working 9
2021-06-16 17:58:47.577008
Subprocesses ended, reading their results...
('func2', 0)
('func2', 1)
('func2', 2)
('func2', 3)
('func2', 4)
('func2', 5)
('func2', 6)
('func1', 10)
('func2', 7)
('func2', 8)
('func2', 9)

【讨论】:

  • 我在 spyder 中尝试并得到了错误,在 jupyter 中尝试只得到“子进程结束,正在读取它们的结果......”作为输出
  • 尝试在终端/命令提示符中运行它,而不是在 IDE 中,更不用说在笔记本中...
  • 只是好奇,为什么在 ide 中打印多线程而不是多处理。我什至尝试过 sys.flush。
  • 您是否将脚本保存在某处而不是“只是运行它”?多处理将要求程序在文件系统上可用,以便生成它的副本。
  • 一旦保存,我就会得到输出。在 spyder 中我得到但不是在笔记本中.. IDE 工作正常。
猜你喜欢
  • 2020-06-07
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多