线程池和进程池的使用
线程池和进程池模块:
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
Python2版本: 线程池:不支持 进程池:支持 Python3版本: 线程池:支持 进程池:支持
ThreadPoolExecutor 线程池
ThreadPoolExecutor
是一个 Executor
子类,它使用一个线程池来异步执行调用。
语法:
class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
一个 Executor
子类,它使用一个最多 max_workers 线程的池来异步地执行调用。
如果 max_workers 是 None
或未给出,它将默认为机器上的处理器数乘以 5
,假设 ThreadPoolExecutor
经常用于重叠I/O而不是CPU工作,并且工作程序的数量应该高于数量的 ProcessPoolExecutor
工人。
thread_name_prefix 参数,以允许用户控制由池创建的工作线程的threading.Thread名称,以便于调试。
ProcessPoolExecutor 进程池
ProcessPoolExecutor
类是一个 Executor
子类,它使用进程池来异步执行调用。 ProcessPoolExecutor
使用 multiprocessing
模块,它允许它侧面 Global Interpreter Lock,但也意味着只有可拾取对象可以被执行和返回。
__main__
模块必须可以由worker子进程导入。这意味着 ProcessPoolExecutor
将不在交互式解释器中工作。(进程池必须在main中执行才生效)
从提交到 ProcessPoolExecutor
的可调用方调用 Executor
或 Future
方法将导致死锁。
语法:
class concurrent.futures.ProcessPoolExecutor(max_workers=None)
使用最多 max_workers 进程的池异步执行调用的 Executor
子类。如果 max_workers 是 None
或未给出,它将默认为机器上的处理器数。如果 max_workers 低于或等于 0
,则将产生 ValueError
。
当其中一个工作进程突然终止时,现在会出现 BrokenProcessPool
错误。以前,行为是未定义的,但对执行器或其未来的操作通常会冻结或死锁。
import time def task(i): time.sleep(1) print(i) for row in range(100): task(row)
# 100任务 import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def task(i): time.sleep(1) print(i) p = ThreadPoolExecutor(10) #有100个任务,每次只处理10个任务,其他任务等待前10个任务完成 # p = ProcessPoolExecutor(10) #进程池,只需要把ThreadPoolExecutor更改为ProcessPoolExecutor即可。 for row in range(100): p.submit(task,row)