Python 中的线程池:多处理池的替代方案
多处理模块的 Pool 类提供了一种使用工作进程并行化代码的便捷方法。然而,对于某些用例,可能需要利用线程而不是进程。本文探讨了多处理模块中可用的另一种基于线程的 Pool 接口。
问题陈述:
用户寻求提供“Pool”类的 Python 库用于线程工作进程,类似于多处理模块的 Pool 类。这将允许使用多处理池轻松并行化类似于以下示例的任务:
def long_running_func(p): c_func_no_gil(p) p = multiprocessing.Pool(4) xs = p.map(long_running_func, range(100))
但是,用户希望避免与创建新进程相关的开销。
解决方案:
多处理模块包含一个基于线程的 Pool 接口,值得探索。这个鲜为人知的接口可以使用 multiprocessing.pool 模块中的 ThreadPool 类导入:
from multiprocessing.pool import ThreadPool
在幕后,这个 ThreadPool 类利用了一个包装 Python 线程的虚拟 Process 类。这个虚拟 Process 类在 multiprocessing.dummy 模块中实现,该模块提供了基于线程的完整多处理接口。
用法示例:
要使用 ThreadPool,请实例化具有所需数量的工作线程的 ThreadPool 对象。然后,调用 map 方法在工作线程之间并行化函数。
# Create a ThreadPool with 4 worker threads pool = ThreadPool(4) # Parallelize the `long_running_func` on 100 inputs results = pool.map(long_running_func, range(100))
以上是我什么时候应该使用Python的ThreadPool而不是multiprocessing.Pool?的详细内容。更多信息请关注PHP中文网其他相关文章!