import asyncio import time import threading def blocking_task(): print(f"开始阻塞任务,线程: {threading.current_thread().name}") time.sleep(2) print("阻塞任务完成")
async def main(): print(f"主事件循环线程: {threading.current_thread().name}") await asyncio.to_thread(blocking_task) print("阻塞任务await结束,继续事件循环") asyncio.run(main())
主事件循环线程: MainThread 开始阻塞任务,线程: ThreadPoolExecutor-0_0 阻塞任务完成 阻塞任务await结束,继续事件循环
import asyncio import time import threading def blocking_task(i): print(f"开始阻塞任务{i},线程: {threading.current_thread().name}") time.sleep(2) print(f"阻塞任务{i}完成") async def main(): print(f"主事件循环线程: {threading.current_thread().name}") tasks = [blocking_task(i) for i in range(3)] print("所有阻塞任务完成,继续事件循环") asyncio.run(main())
主事件循环线程: MainThread 开始阻塞任务0,线程: MainThread 阻塞任务0完成 开始阻塞任务1,线程: MainThread 阻塞任务1完成 开始阻塞任务2,线程: MainThread 阻塞任务2完成 所有阻塞任务完成,继续事件循环
import asyncio import time import threading def blocking_task(i): print(f"开始阻塞任务{i},线程: {threading.current_thread().name}") time.sleep(2) print(f"阻塞任务{i}完成") async def main(): print(f"主事件循环线程: {threading.current_thread().name}") # 并发启动3个阻塞任务 tasks = [asyncio.to_thread(blocking_task, i) for i in range(3)] # 等待所有任务完成 await asyncio.gather(*tasks) print("所有阻塞任务完成,继续事件循环") asyncio.run(main())
主事件循环线程: MainThread 开始阻塞任务0,线程: asyncio_0 开始阻塞任务1,线程: asyncio_1 开始阻塞任务2,线程: asyncio_2 阻塞任务0完成 阻塞任务1完成 阻塞任务2完成 所有阻塞任务完成,继续事件循环
Python asyncio: [Event Loop Thread] |---> Coroutine A (running) |---> Coroutine B (waiting for IO) |---> Coroutine C (running) Python threading: [Thread1] [Thread2] [Thread3] (OS schedules these threads, but only one can hold GIL) Java threading: [Thread1] [Thread2] [Thread3] (OS schedules real parallel threads on multiple CPU cores)