牛客python笔记2026.7.22
asyncio基本知识点
asyncio 是单线程 + 协作式调度,介绍这个库之前需要先区分以下三个概念
-
进程:操作系统资源分配的最小单位,拥有独立的虚拟内存空间、文件描述符表,进程间隔离性强(Crash不影响其他进程)。
-
线程:操作系统CPU调度的最小单位,共享所属进程的堆内存和文件句柄,切换开销约微秒级。
-
协程:用户态的轻量级调度单元,完全由应用程序(事件循环)控制,切换开销仅纳秒级,不涉及内核态切换,本质是单线程内的函数挂起与恢复。
其中线程是操作系统看见的,协程是应用程序自己看见的,进程到线程是防止频繁的资源切换,线程到协程是防止频繁的内核态切换,python中的为单线程,因此线程和协程之间时一对多的关系,由于GIL的存在无论多少cpu,同一时刻只有一个线程在执行Python字节码。
事件循环(Event Loop)
它内部维护了三个核心队列:
-
Ready Queue(就绪队列):当前可以立即执行的Task。
-
Scheduled Queue(延迟队列):存放
asyncio.sleep()或定时任务,到了设定时间就转入就绪队列。 -
I/O Wait Queue(等待队列):正在等待网络/磁盘响应的Task(处于挂起状态)。
| 类别 | 核心函数 | 工程场景与坑点 |
|---|---|---|
| 生命周期管理 | asyncio.run() |
唯一入口。内部自动创建循环、运行、关闭。禁止在Jupyter Notebook或已运行循环中调用(会报RuntimeError)。 |
| 任务创建 | asyncio.create_task() |
将协程包装为Task,立即送入事件循环调度。注意:创建后必须保留引用,否则GC会销毁它。 |
| 结构化并发 | asyncio.TaskGroup() |
Python 3.11+ 首选。类比“项目组”,退出时自动等待所有子任务,异常自动传播。彻底替代gather和wait的旧写法。 |
| 超时控制 | asyncio.timeout() |
上下文管理器。超时后内部抛TimeoutError,但不会立即取消任务,只会设置标志,比wait_for更温和、不易造成僵尸任务。 |
| 同步原语 | asyncio.Semaphore() |
限流器。初始化Semaphore(100),async with sem:包裹请求,防止瞬间打爆下游数据库连接池。 |
| 数据通信 | asyncio.Queue() |
异步版queue.Queue。用于生产者-消费者解耦。注意:get()和put()必须await,且队列为空时会自动让出CPU。 |
| 与线程交互 | loop.run_in_executor() |
将同步阻塞函数扔给线程池执行,防止阻塞事件循环。这是混编同步与异步代码的唯一正确解。 |
元类
元类(Metaclass)是“类的类”:type 是所有类的元类。class Foo(metaclass=Meta) 意味着创建 Foo 这个类对象时,不是由默认的 type 构造,而是由 Meta 这个元类构造。
__new__ 与 __init__ 在元类中的分工:
__new__:负责分配内存并生成类对象(相当于“盖毛坯房”)。它在类对象存在之前执行。__init__:负责初始化已生成的类对象(相当于“精装修”)。它在__new____返回类对象之后执行。
list小知识点
| 方法/语句 | 删除方式 | 返回值 | 适用场景 |
|---|---|---|---|
| pop() | 按索引删除,返回元素,
|
被删元素 | 需获取被删元素值 |
| del | 按索引/切片删除
|
无 | 批量删除或清空部分元素 |
注意remove()只能删除列表中第一次出现的指定值,而非指定位置。

浙公网安备 33010602011771号