【问题标题】:Python multiprocessing share large data through Queue?Python多处理通过Queue共享大数据?
【发布时间】:2021-06-23 16:27:45
【问题描述】:

我想在多处理计算中将输出数据放入队列中。似乎是当return的大小太大时,程序就卡住了。为了说明这个问题,这里有一个最小的代码。任何人都可以帮助完成这项工作吗?

from multiprocessing import Process, Queue
import numpy as np

def foo(q, qid):
    x = np.random.randint(0,5,7)
    y = np.random.random(100*10*10).reshape(100,10,10)
    q.put([qid,x,y])

def main():
    processes = []
    q = Queue()

    for qid in range(5):
        p = Process(target=foo, args=(q, qid))
        p.start()
        processes.append(p)

    for process in processes:
        process.join()

    for qid in range(5):
        [_, x, y] = q.get()
        print(x)
        print(y)

if __name__ == '__main__':
    main()

【问题讨论】:

  • “卡住”是什么意思?没有错误信息?锁上?还是只是需要很长时间?从较小的数据开始,以确保您的程序按预期工作,然后慢慢增加数据大小。
  • 较小的数据效果很好。对于上面的示例,它只是卡住而没有错误消息。调试器可以运行到 q.put()
  • 可能会有很好的答案here 或许你可以通过给每个进程自己的队列来扩大规模,但正如上面的链接会告诉你的,队列存在潜在的实现问题。
  • 这能回答你的问题吗? Deadlock with big object in multiprocessing.Queue

标签: python python-3.x python-multiprocessing


【解决方案1】:

我想出一种解决方案如下切换joinget。默认情况下,get 方法会阻塞。

from multiprocessing import Process, Queue
import numpy as np

def foo(q, qid):
    x = np.random.randint(0,5,7)
    y = np.random.random(100*10*10).reshape(100,10,10)
    q.put([qid,x,y])

def main():
    processes = []
    q = Queue()

    for qid in range(5):
        p = Process(target=foo, args=(q, qid))
        p.start()
        processes.append(p)

    for qid in range(5):
        [_, x, y] = q.get()
        print(x)
        print(y)

    for process in processes:
        process.join()

 if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 2011-01-06
    • 2023-03-10
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多