Python中concurrent.futures._base的使用示例和注意事项
发布时间:2023-12-31 21:46:05
在Python中,concurrent.futures._base模块提供了线程池和进程池的实现,用于实现并发执行任务。它提供了一种简单而高效的方式来同时处理多个任务,从而提高程序的性能。
首先,我们需要导入concurrent.futures._base模块:
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
然后,我们可以使用ThreadPoolExecutor来创建线程池,使用ProcessPoolExecutor来创建进程池:
# 创建线程池
with ThreadPoolExecutor(max_workers=5) as executor:
# 执行任务
future = executor.submit(function, arg1, arg2, ...)
# 获取返回值
result = future.result()
# 创建进程池
with ProcessPoolExecutor(max_workers=5) as executor:
# 执行任务
future = executor.submit(function, arg1, arg2, ...)
# 获取返回值
result = future.result()
在上述代码中,我们使用with语句创建了线程池和进程池,并指定了最大的工作线程数或者进程数。使用submit方法向线程池或者进程池提交任务,通过future对象获取任务的返回值。
注意事项和使用示例:
1. future对象的result()方法是阻塞的,也就是说,它会等待任务执行完毕并返回结果。如果任务没有执行完毕,result()方法会一直阻塞。
def function():
time.sleep(5)
return 1
with ThreadPoolExecutor(max_workers=5) as executor:
future = executor.submit(function)
result = future.result() # 阻塞5秒钟
print(result) # 输出1
2. 当提交的任务较多时,可以使用as_completed方法来获取已完成的任务的返回值。
def function(n):
time.sleep(n)
return n
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(function, i) for i in range(5)]
for future in concurrent.futures.as_completed(futures):
result = future.result()
print(result) # 依次输出0, 1, 2, 3, 4
3. 可以使用map方法来批量提交任务,并获取返回值列表。
def function(n):
time.sleep(n)
return n
with ThreadPoolExecutor(max_workers=5) as executor:
results = executor.map(function, range(5))
for result in results:
print(result) # 依次输出0, 1, 2, 3, 4
4. 使用with语句可以确保线程池或者进程池的正确关闭和资源释放。
with ThreadPoolExecutor(max_workers=5) as executor:
# 执行任务...
# 在with语句块结束后,线程池已被正确关闭和资源释放
总结:
concurrent.futures._base模块提供了线程池和进程池的实现,可以方便地实现并发执行任务。使用它可以提高程序的性能,特别是当有多个任务可以并行执行时。需要注意的是,future对象的result()方法是阻塞的,可使用as_completed方法或map方法来获取已完成的任务的返回值。使用with语句可以确保线程池或者进程池的正确关闭和资源释放。
