用一个具体的示例,展示如何使用 ThreadPoolExecutor
和 asyncio
来并行运行多个任务,并输出结果。
代码:
import asyncio
import time
from concurrent.futures import ThreadPoolExecutor
class WorkJob:
def __init__(self, job_id):
self.job_id = job_id
# 模拟一个耗时的任务
def run(self):
print(f"Job {self.job_id} started in thread.")
time.sleep(2)
return f"Jon {self.job_id} finished"
# 使用run_in_executor将任务放到线程池中执行
async def run_in_thread(job):
loop = asyncio.get_event_loop()
with ThreadPoolExecutor() as executor:
result = await loop.run_in_executor(executor, job.run)
return result
async def main():
# 创建多个任务
jobs = [WorkJob(job_id=i) for i in range(10)]
# 并行执行所有任务
results = await asyncio.gather(
*[run_in_thread(job) for job in jobs]
)
# 输出结果
for result in results:
print(f"{result}")
if __name__ == "__main__":
asyncio.run(main())
代码运行流程
WorkJob
类:每个任务都有一个唯一的job_id
,并且在run()
方法中模拟一个耗时的操作(用time.sleep(2)
来模拟任务处理的延迟)。run_in_thread
函数:通过run_in_thread
把任务交给线程池中的线程并返回结果。mian
函数:创建了10个WorkJob
,并通过asyncio.gather
并行执行它们,最后收集并输出所有任务的结果。
输出结果示例
说明:
- 这10个任务会同时启动,在运行中其实可以看到,几乎是同时输出的
Job x started in thread.
。 - 经过2秒钟的模拟延迟后,任务会陆续完成,输出
Jon x finished
相关文章:
python多线程开发