python  asyncio常规操作记录

 更新时间:2026年03月21日 14:01:58   作者:mingshili  
本文介绍了Python asyncio的核心并发机制和API,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

Event Loop 执行机制

Event loop 本质是单线程内的无限循环调度器,不断从任务队列取出就绪的任务执行:

while True:
    events = poll_for_ready_events()   # 检查就绪事件(IO完成、定时器到期、回调投递)
    for event in events:
        execute(event.callback)        # 逐个执行

协程遇到 await挂起自身、让出控制权给 loop,loop 去执行其他就绪任务;
等待的操作完成后,loop 恢复该协程继续执行。

一个线程最多运行一个 event loop。

三个核心 API 对比

1.asyncio.create_task(coro)

在当前 loop 内并发调度一个协程,立即返回 asyncio.Task,不阻塞。

async def main():
    task1 = asyncio.create_task(fetch_a())   # 立即调度,不等完成
    task2 = asyncio.create_task(fetch_b())   # 两个协程并发运行
    result_a = await task1                   # 需要结果时再 await
    result_b = await task2

适用场景: 同一个 loop 内同时跑多个异步 IO 任务(并发请求、并发监听等)。

2.asyncio.to_thread(func, *args)

把同步阻塞函数丢到线程池执行,当前协程挂起等待结果,但 event loop 不阻塞。

async def main():
    # time.sleep 是同步阻塞的,直接调用会卡死整个 loop
    await asyncio.to_thread(time.sleep, 5)   # 丢到线程池,loop 继续处理别的
    # 典型场景:CPU 密集计算、没有 async 版本的阻塞 IO 库
    data = await asyncio.to_thread(read_big_file, path)

适用场景: 调用没有 async 版本的阻塞函数(文件 IO、CPU 计算、旧的同步库),
避免卡死 event loop。

await会卡住当前协程吗?

当前协程会等待,但 event loop 和其他协程不受影响:

写法当前协程event loop其他协程
time.sleep(5)全卡
await asyncio.to_thread(time.sleep, 5)不卡正常跑
await asyncio.sleep(5)不卡正常跑

3.asyncio.run_coroutine_threadsafe(coro, loop)

从另一个线程向指定 loop 投递一个协程,返回 concurrent.futures.Future

# 在非 asyncio 的普通线程中:
future = asyncio.run_coroutine_threadsafe(play_audio(data), main_loop)
result = future.result(timeout=10)   # 阻塞等待结果(在当前线程阻塞,不影响 loop)

适用场景: 普通线程需要让某个 event loop 执行一个协程(跨线程投递异步任务)。

相关 API:call_soon_threadsafe

loop.call_soon_threadsafe(callback, *args)

run_coroutine_threadsafe 类似,但投递的是普通回调函数而非协程。

# 从 WebSocket 线程把音频流注册到主线程的 Mixer
self._main_loop.call_soon_threadsafe(mixer.add_stream, stream)

总结对比表

API调用位置投递目标方向返回值
create_task(coro)协程内协程 → 同一个 loopasync → asyncasyncio.Task
to_thread(func)协程内同步函数 → 线程池async → sync → asyncawaitable
run_coroutine_threadsafe(coro, loop)任意线程协程 → 另一个线程的 loopsync → asyncconcurrent.futures.Future
call_soon_threadsafe(cb)任意线程回调 → 另一个线程的 loopsync → sync(callback)None

速记口诀

create_task              → 同 loop 内并发跑协程
to_thread                → 把同步阻塞的东西丢出去,别卡我的 loop
run_coroutine_threadsafe → 从外面往别人的 loop 里塞协程
call_soon_threadsafe     → 从外面往别人的 loop 里塞回调

项目中的实际应用

本项目 AudioReceiverServer 中存在两个线程各自运行一个 event loop:

主线程 event loop                     WebSocket 线程 event loop
┌───────────────────┐                ┌───────────────────┐
│  Mixer 协程        │                │  ws.recv() 协程 A  │
│  其他音频处理 ...   │  ◄── call_soon │  ws.recv() 协程 B  │
│                   │   threadsafe   │  ws.recv() 协程 C  │
└───────────────────┘                └───────────────────┘
  • WebSocket 线程的 loop 同时 await 多个连接的 recv(),谁来数据就恢复谁
  • 需要操作主线程的 Mixer 时,通过 call_soon_threadsafe 把回调投递到主线程 loop

到此这篇关于python asyncio常规操作记录的文章就介绍到这了,更多相关python asyncio内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3利用scapy局域网实现自动多线程arp扫描功能

    Python3利用scapy局域网实现自动多线程arp扫描功能

    这篇文章主要介绍了Python3利用scapy局域网实现自动多线程arp扫描功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 使用Python实现在Windows下安装Django

    使用Python实现在Windows下安装Django

    今天小编就为大家分享一篇关于使用Python实现在Windows下安装Django,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 使用Python设置Excel数据验证规则

    使用Python设置Excel数据验证规则

    在处理电子表格数据时,确保输入数据的准确性和一致性至关重要,数据验证功能允许开发者设置规则来限制用户可以在单元格中输入的内容,从而防止错误数据的录入,本文将介绍如何使用 Python 在 Excel 工作表中添加各种类型的数据验证规则,需要的朋友可以参考下
    2026-05-05
  • vscode autopep8无法格式化python代码问题解决

    vscode autopep8无法格式化python代码问题解决

    这篇文章主要为大家介绍了vscode autopep8无法格式化python代码问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • python连接mongodb操作数据示例(mongodb数据库配置类)

    python连接mongodb操作数据示例(mongodb数据库配置类)

    这篇文章主要介绍了python连接mongodb操作数据示例,主要包括插入数据、更新数据、查询数据、删除数据等
    2013-12-12
  • ChatGLM-6B+LangChain环境部署与使用实战

    ChatGLM-6B+LangChain环境部署与使用实战

    这篇文章主要介绍了ChatGLM-6B+LangChain环境部署与使用方法,结合实例形式详细分析了ChatGLM-6B+LangChain环境部署相关步骤、实现方法与相关注意事项,需要的朋友可以参考下
    2023-07-07
  • 深入详解Python解析带有命名空间XML的多种方法

    深入详解Python解析带有命名空间XML的多种方法

    XML命名空间是XML技术中​​不可或缺​​的重要组成部分,它通过提供元素和属性的唯一标识,本文将深入探讨Python中解析带有命名空间的XML文档的各种方法和技术,希望对大家有所帮助
    2025-09-09
  • python-httpx的使用及说明

    python-httpx的使用及说明

    这篇文章主要介绍了python-httpx的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python 学习教程之networkx

    Python 学习教程之networkx

    networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。对Python networkx相关知识感兴趣的朋友跟随小编一起看看吧
    2019-04-04
  • Python学习之字符串常用操作详解

    Python学习之字符串常用操作详解

    字符串是Pyhon中的常用的数据类型,这篇文章主要为大家详细介绍一下python字符串的一些常用操作,文中示例代码讲解详细,需要的朋友可以参考下
    2022-09-09

最新评论