Python threadpoolexecutor使用详解
时间: 2024-12-30 13:26:37 浏览: 10
### Python ThreadPoolExecutor 使用教程
#### 创建和管理线程池
`ThreadPoolExecutor` 是 `concurrent.futures` 模块的一部分,用于简化多线程编程。通过创建一个 `ThreadPoolExecutor` 实例来启动多个工作线程[^1]。
```python
from concurrent.futures import ThreadPoolExecutor, as_completed
def task(n):
return n * n
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(task, i): i for i in range(10)}
for future in as_completed(futures):
result = future.result()
print(f'Task {futures[future]} returned: {result}')
```
此代码片段展示了如何定义任务函数,并利用上下文管理器 (`with`) 来自动关闭线程池。提交的任务会立即返回一个 Future 对象,该对象表示异步执行的操作结果。可以使用 `as_completed()` 函数迭代已完成的任务并获取其结果。
#### 处理异常情况
如果某个子线程抛出了未捕获的异常,则可以通过调用相应 Future 的 `.exception()` 方法检测到它。为了确保程序能够处理这些意外状况,在设计时应考虑加入适当的错误恢复机制:
```python
try:
value = future.result(timeout=timeout_seconds)
except TimeoutError:
logger.error('Operation timed out.')
except Exception as exc:
logger.error('Task generated an exception: %s', exc)
else:
logger.info('Result is %d bytes long.', len(value))
finally:
# Cleanup code here.
```
这段代码示范了如何设置超时时间以及捕捉任何类型的异常,从而保证即使遇到问题也能优雅地结束操作[^2]。
#### 避免死锁风险
当与 Future 关联的可调用函数等待另一个 Future 的结果时可能会发生死锁现象。为了避免这种情况的发生,应该避免让同一个线程内的两个或更多 Future 彼此依赖对方完成才能继续运行下去。例如,不要在一个回调里直接访问其他还在排队中的 Futures;而是采用事件驱动的方式通知监听者有关进度的信息。
阅读全文