牛客python笔记2026.7.22

asyncio基本知识点

asyncio 单线程 + 协作式调度,介绍这个库之前需要先区分以下三个概念

  • 进程:操作系统资源分配的最小单位,拥有独立的虚拟内存空间、文件描述符表,进程间隔离性强(Crash不影响其他进程)。

  • 线程:操作系统CPU调度的最小单位,共享所属进程的堆内存和文件句柄,切换开销约微秒级。

  • 协程用户态的轻量级调度单元,完全由应用程序(事件循环)控制,切换开销仅纳秒级,不涉及内核态切换,本质是单线程内的函数挂起与恢复

其中线程是操作系统看见的,协程是应用程序自己看见的,进程到线程是防止频繁的资源切换,线程到协程是防止频繁的内核态切换,python中的为单线程,因此线程和协程之间时一对多的关系,由于GIL的存在无论多少cpu,同一时刻只有一个线程在执行Python字节码。

 事件循环(Event Loop)

它内部维护了三个核心队列:

  1. Ready Queue(就绪队列):当前可以立即执行的Task。

  2. Scheduled Queue(延迟队列):存放asyncio.sleep()或定时任务,到了设定时间就转入就绪队列。

  3. I/O Wait Queue(等待队列):正在等待网络/磁盘响应的Task(处于挂起状态)。

类别 核心函数 工程场景与坑点
生命周期管理 asyncio.run() 唯一入口。内部自动创建循环、运行、关闭。禁止在Jupyter Notebook或已运行循环中调用(会报RuntimeError)。
任务创建 asyncio.create_task() 将协程包装为Task,立即送入事件循环调度。注意:创建后必须保留引用,否则GC会销毁它。
结构化并发 asyncio.TaskGroup() Python 3.11+ 首选。类比“项目组”,退出时自动等待所有子任务,异常自动传播。彻底替代gatherwait的旧写法。
超时控制 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() 按索引删除,返回元素,
removed = my_list.pop(1)
被删元素 需获取被删元素值
del 按索引/切片删除
del my_list[1]
批量删除或清空部分元素

 

 

 

 

 

 

 

注意remove()只能删除列表中第一次出现的指定值,而非指定位置。

 

posted @ 2026-07-23 20:17  突破铁皮  阅读(10)  评论(0)    收藏  举报