我正在开发一个库函数,它使用concurrent.futures
将网络I/O分布到多个线程上。(大文件),所以我想切换到多个进程。但是,多个进程对于其他一些工作负载也不是很理想(许多小文件)。我想分裂的差异,并有多个进程,每个都有自己的线程池。
问题在于作业排队-concurrent.futures
似乎没有设置为多个进程正确排队作业,每个进程可以同时处理多个作业。虽然提前将作业列表分解为块是一种选择,但如果作业在各个线程完成一项任务时异步流向每个进程,工作会顺利得多。
如何使用这个或类似的API有效地将多个进程和线程的作业排队?除了编写自己的执行器之外,还有什么明显的解决方案是我忽略的吗?或者有什么混合进程/线程执行器的现有技术吗?
1条答案
按热度按时间bf1o4zei1#
如果我理解您的意图,您基本上有很多适合多线程的作业,除了一些CPU密集型的工作。因此,您的想法是在多个子进程中创建多个线程池,以便减少GIL争用。当然,在任何给定的子进程中,CPU密集型代码将仅串行执行(假设它是Python字节码),所以它不是一个完美的解决方案。
一种方法是创建一个非常大的多处理池(大于内核数量)。创建进程的数量是有限制的,而且创建进程的成本很高。但是,由于大多数时间它们都在等待I/O完成,因此I/O部分将并发执行。
一个更好的方法是创建一个多处理池,它的执行器可以和其他必需的参数一起传递给多线程池辅助函数。这与您计划做的相反。当辅助函数有CPU密集型工作要执行时,它可以将工作提交给传递多处理池执行器,并阻塞返回的结果。通过这种方式,您可以在给定内核数量的情况下获得最佳并行性。这是我的建议。.例如:
图纸:
但是如果你想坚持你最初的想法,或者由于某种原因,上面的框架不适合你的实际情况,也许下面的方法可以起作用:
图纸: