import time
import asyncio
def blocking_task(name):
time.sleep(3)
return "done"
async def async_task(name):
print(f"{name}: start")
result = await asyncio.to_thread(blocking_task, name)
print(f"{name}: end")
return result
async def main():
tasks = [
asyncio.create_task(async_task("task1")),
asyncio.create_task(async_task("task2")),
asyncio.create_task(async_task("task3"))
]
await asyncio.gather(*tasks)
asyncio.run(main())
import asyncio
import time
def blocking_task():
time.sleep(3)
async def async_task():
loop = asyncio.get_running_loop()
print("Before blocking")
await loop.run_in_executor(None, blocking_task) # 放线程池里跑,不阻塞事件循环
print("After blocking")
async def main():
task = asyncio.create_task(async_task())
await task
asyncio.run(main())
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)