本篇文章为本人并发编程的学习记录,欢迎感兴趣的同学一起交流讨论!
from concurrent.futures imoprt ThreadPoolExecutor
ThreadPoolExecutor(max_workers=...) # 定义一个最大线程数为max_workers的线程池
with ThreadPoolExecutor() as pool:
futures = []
futures.append(pool.submit(target=func, args=(arg,)))
futures.append(pool.submit(...)
...
for future in futures:
print(future.result)
# submit方法会返回一个future对象,该方法并不是在线程执行完毕后才返回的,而是在调用方法的时候即返回。
# future对象可以监测一个线程执行的状态
# .result()得到进程返回结果
# .done()判断进程是否执行结束
# ...
with ThreadPoolExecutor(5) as pool:
futures = pool.map(func, args)
for future in futures:
print(future.result())
# .map()使用起来十分方便,func为线程的target方法,而args则是每个线程所需的arg的list。map方法与python本身的map方法思路相同,即args中的每一个参数都执行相同的func操作。
# 需要注意的是,使用map方法进行线程池的操作,起返回值futures是按args的传入顺序排列的。(即使各个thread的执行结束顺序与之不同)
from concurrent.futures import as_completed
with ThreadPoolExecutor(5) as pool:
futures = pool.map(func, args)
for future in as_completed(futures):
print(future.result())
# as_completed(futures)是一个生成器,它会判断futures中的进程是否完成执行,如果执行完成则yeild这个future。
# 因此使用a s_completed包裹的futures其输出的顺序是不固定的,这在一些场合是有必要的。