【发布时间】:2017-09-22 09:19:11
【问题描述】:
我对@987654322@ 库很陌生,并且在与map() 一起使用时对其Pool 模块有疑问。假设我有 4 个工作线程和 6 个任务要完成。我所做的是(使用multiprocessing.dummy,因为我想生成线程而不是进程)
from multiprocessing.dummy import Pool as ThreadPool
def print_it(num):
print num
def multi_threaded():
tasks = [1, 2, 3, 4, 5, 6]
pool = ThreadPool(4)
r = pool.map(print_it, tasks)
pool.close()
pool.join()
multi_threaded()
我想了解 Pool.map() 如何处理任务?三个选项:
- 它是否首先产生 4 个线程,完成前 4 个任务并让线程终止。然后为剩余的任务生成 2 个新线程?
- 它是否产生 4 个线程,为它们分配 4 个任务,一旦某个线程完成其任务,将新任务分配给同一线程。
- 其他方式。
这种见解会很有帮助,因为它将帮助我考虑在产品中更有效地使用 Pool.map()。
【问题讨论】:
-
我所知道的几乎所有池子都是(2)。但我不知道这个特定的库,通常我对 python + 多线程的东西主要是令人失望的经历。我认为一些有限的智能解决方案是很有可能的。祝你好运,得到详细的答案。
-
您可以通过将
print_it函数也设为sleep来进行测试,看看会发生什么。在 Python 3.6 中进行此测试时,似乎只要有空闲线程来处理新任务就会开始。 -
为什么不read the source 自己看看?
ThreadPool类是普通multiprocessing.pool.Pool的子类,它覆盖了一些东西(如果需要,可以在文件底部查看它的定义)。
标签: python threadpool python-multiprocessing