Fari

multiprocessing.Manager().Queue() 的一个问题

import multiprocessing
import time

def task(q: multiprocessing.Queue, name):
    while True:
        v = q.get()
        print(f"subprocess {name=} get {v=}")

if __name__ == "__main__":
    q = multiprocessing.Manager().Queue()

    p1 = multiprocessing.Process(target=task, args=(q, "sub1",))  # 创建第一个进程用于接收 queue 中的数据
    p1.start()

    q.put(1)  # 向 queue 中发送两条数据
    time.sleep(1)
    q.put(2)
    time.sleep(1)

    p1.terminate()  # 销毁第一个进程
    p1.join()
    p1.close()

    p2 = multiprocessing.Process(target=task, args=(q, "sub2", ))  # 创建第二个进程用于接收 queue 中的数据
    p2.start()

    q.put(3)  # 向 queue 中发送两条数据
    time.sleep(1)
    q.put(4)

    time.sleep(999)

运行结果基本为:

值得注意的是,我试了很多次,结果都是这样的,3 那个元素消失了

在这个过程中,我还发现,如果将上面的 multiprocessing.Manager().Queue() 修改为 multiprocessing.Queue(),则可能会出现即使向queue中put数据成功了,get() 都会一直阻塞,我猜测可能存在锁释放的问题。

所以后面将 Queue() 都改为了 multiprocessing.Pipe() 暂时没有发现问题