首页 > 解决方案 > python中的多处理不打印任何语句

问题描述

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

多处理不起作用。

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

标签: pythonmultiprocessingpython-multiprocessingpython-multithreading

解决方案


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

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

正如进一步评论中所讨论的,

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

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

请记住main()使用if __name__ == "__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)

推荐阅读