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

Mad*_*Raj 3 python multiprocessing python-multithreading python-multiprocessing

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

多重处理不起作用。

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)
Run Code Online (Sandbox Code Playgroud)

即使 print(a) 也没有打印该值。它说

NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)

AKX*_*AKX 5

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

最简单的通信通道是 a 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()
Run Code Online (Sandbox Code Playgroud)

输出是:

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)
Run Code Online (Sandbox Code Playgroud)