python 中的多处理不打印任何语句

Multiprocessing in python doesnt print any statements

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

多处理不工作。

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

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

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

如进一步评论中所述,

  • 您不能在 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)