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)