Python3中大规模蛮力最大化的高效多处理

Python3中大规模蛮力最大化的高效多处理,python,parallel-processing,python-3.x,Python,Parallel Processing,Python 3.x,这是我最近问题的延伸。希望这个问题的版本更具体 TL;DR:在一个多处理模型中,工作进程通过使用多处理.queue从队列馈送,为什么我的工作进程如此空闲?每个进程都有自己的输入队列,因此它们不会为了共享队列的锁而相互争斗,但队列实际上花费了很多时间,只是空的。主进程正在运行一个I/O绑定线程——这是否会减慢输入队列中CPU绑定的填充速度 我试图找到N个集合的笛卡尔乘积的最大元素,每个集合都有m_I个元素(对于0你的元素是什么样子的?可能是将它们放入队列的速度很慢,这显然是一个瓶颈。请注意,每个元

这是我最近问题的延伸。希望这个问题的版本更具体

TL;DR:在一个多处理模型中,工作进程通过使用
多处理.queue
从队列馈送,为什么我的工作进程如此空闲?
每个进程都有自己的输入队列,因此它们不会为了共享队列的锁而相互争斗,但队列实际上花费了很多时间,只是空的。主进程正在运行一个I/O绑定线程——这是否会减慢输入队列中CPU绑定的填充速度


我试图找到N个集合的笛卡尔乘积的最大元素,每个集合都有m_I个元素(对于0你的元素是什么样子的?可能是将它们放入队列的速度很慢,这显然是一个瓶颈。请注意,每个元素都被一次又一次地独立地酸洗

如果是这种情况,这种方法可能有助于:

  • 选择一个基数>=工作者数量的集合。理想情况下,它将远远超过工作者数量。将此集合称为a,并为每个工作者分配大约相等的a子集。将该子集传输给每个工作者
  • 将除A之外的所有集合的完整内容分发给每个辅助进程(可能通过
    pickle.dumps
    一次,然后将相同的字符串发送给每个辅助进程,也可能通过共享内存或其他方式)
  • 然后,每个工作人员都拥有完成其子集所需的全部信息。它可以在
    产品(my_A_subset,*other_set)
    (可能顺序不同)上快速启动,在每个作业之间(或每三个作业或其他任何作业)轮询某种停止信号。这不需要通过队列,一位共享内存值可以正常工作

我想我明白你的意思了,如果是这样的话,那就需要大量的重写。关于我不断地
dump
ing和
load
ing元素(它们是
集合的子类的实例。Counter
),你肯定有一个观点。如果我对它们进行预酸洗,会有帮助吗?例如,在
main
中的
for
循环之前,有一行类似于
sets\u of_pickles=map(lambda s:map(dumps,s),set)
这可能会有所帮助:它可以节省酸洗成本,但您仍然可以通过IPC一次又一次地传输酸洗字符串,而不是每个工人只传输一次。
                    +-----------+
            in_q0   |   worker0 |----\
            /-------+-----------+     \
+-----------+   in_q1   +-----------+  \ out_q  +-----------+
|   main    |-----------|   worker1 |-----------|   main    |
+-----------+           +-----------+  /        +-----------+
            \-------+-----------+     /
            in_q2   |   worker2 |----/
                    +-----------+