协程

最后发布时间:2025-07-13 11:59:41 浏览量:

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)

快捷入口
Python 思维导图 浏览PDF 下载PDF
分享到:
标签