【Asyncio源码级解析】:揭开事件循环底层实现的秘密

第一章:Python异步编程进阶

在掌握基础的 async/await 语法后,深入理解异步编程的核心机制是提升 Python 高并发处理能力的关键。本章将探讨事件循环的底层控制、任务调度优化以及异步上下文管理等高级主题。

事件循环的精细控制

Python 的 asyncio 提供了对事件循环的直接操作接口,允许开发者在复杂场景下手动管理执行流程。通过 asyncio.get_event_loop() 获取当前循环实例,可实现自定义任务注册与调度。
# 获取或创建事件循环
import asyncio

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

async def main_task():
    print("异步主任务开始")
    await asyncio.sleep(1)
    print("异步主任务结束")

# 手动运行直到完成
loop.run_until_complete(main_task())
loop.close()
上述代码展示了如何显式创建并运行事件循环,适用于需精确控制生命周期的后台服务场景。

异步任务的并发管理

使用 asyncio.gather() 可高效并发执行多个协程,并统一返回结果。该方法自动处理异常传播与任务取消。
  1. 定义多个独立的异步操作函数
  2. 在主协程中调用 await asyncio.gather(*tasks)
  3. 处理聚合后的结果或捕获整体异常
方法适用场景是否并发
await coro顺序执行否
asyncio.gather()批量并发任务是
asyncio.create_task()后台持续任务是

异步上下文管理器

利用 async with 可安全管理异步资源,如数据库连接或网络会话。它确保即使发生异常也能正确释放资源。
class AsyncDatabase:
    async def connect(self):
        print("建立数据库连接")
        await asyncio.sleep(0.1)

    async def disconnect(self):
        print("关闭数据库连接")

    async def __aenter__(self):
        await self.connect()
        return self

    async def __aexit__(self, exc_type, exc, tb):
        await self.disconnect()

# 使用方式
async def query_db():
    async with AsyncDatabase() as db:
        print("执行查询操作")

第二章:事件循环的核心机制剖析

2.1 事件循环的启动与运行原理

事件循环(Event Loop)是异步编程的核心机制,负责协调任务队列与主线程的执行顺序。当程序启动时,事件循环自动初始化并持续监听任务队列。
事件循环的基本流程
  • 检查调用栈是否为空
  • 从任务队列中取出最老的回调任务
  • 将该任务推入调用栈执行
  • 重复上述过程
代码执行示例
setTimeout(() => {
  console.log('宏任务');
}, 0);

Promise.resolve().then(() => {
  console.log('微任务');
});

console.log('同步任务');
// 输出顺序:同步任务 → 微任务 → 宏任务
上述代码展示了事件循环中微任务优先于宏任务执行的规则。同步任务最先输出;随后,微任务在当前事件循环末尾执行;最后,宏任务在下一轮事件循环中处理。

2.2 任务调度与协程状态管理

在高并发系统中,任务调度与协程状态管理是保障执行效率与资源隔离的核心机制。通过非抢占式调度器,Go 运行时能够高效地复用操作系统线程,实现数以万计的协程轻量级切换。
协程状态流转
每个协程在其生命周期中经历就绪、运行、阻塞和终止四种状态。当协程发起 I/O 操作或等待锁时,会自动让出执行权,进入阻塞状态,调度器则立即切换至其他就绪协程。
调度器工作窃取机制
Go 调度器采用 M:P:G 模型(线程:逻辑处理器:协程),并支持工作窃取:
// 启动多个协程示例
for i := 0; i < 10; i++ {
    go func(id int) {
        time.Sleep(100 * time.Millisecond)
        fmt.Printf("Task %d done\n", id)
    }(i)
}
上述代码创建了 10 个协程,运行时调度器会将其分配到不同的 P 上,并在本地队列满时触发窃取行为,平衡负载。
  • 协程启动后由当前 P 的本地队列管理
  • 阻塞操作触发协程与线程解绑(GMP 解耦)
  • 恢复时重新入列或被其他 M 窃取执行

2.3 回调机制与就绪队列实现

在异步任务调度中,回调机制是实现事件驱动的核心。当某个异步操作完成时,系统通过预先注册的回调函数通知上层逻辑,从而触发后续处理。
回调注册与触发流程
每个任务在提交时可附带一个回调函数,调度器在任务状态变为“就绪”后自动调用该函数。
type Task struct {
    ID       string
    Callback func(result interface{})
}

func (t *Task) Execute() {
    result := doWork()
    if t.Callback != nil {
        t.Callback(result)
    }
}
上述代码中,Callback 字段保存用户定义的回调函数,Execute() 方法在工作完成后安全调用回调,实现结果传递。
就绪队列的数据结构设计
使用优先级队列管理就绪任务,结合最小堆实现按调度权重出队:
字段名类型说明
Priorityint任务优先级数值,越小越优先
TaskIDstring唯一任务标识

2.4 异步IO与文件描述符监控

在高并发系统中,传统的阻塞IO模型无法满足性能需求。异步IO(AIO)允许应用程序发起IO操作后立即返回,无需等待数据传输完成,从而提升吞吐量。
核心机制:事件驱动与文件描述符监控
操作系统通过 epoll(Linux)、kqueue(BSD)等机制监控多个文件描述符的状态变化。当某个描述符就绪(如可读、可写),内核通知应用程序进行处理。
// 使用 Go 的 net 包实现非阻塞连接监听
listener, _ := net.Listen("tcp", ":8080")
for {
    conn, err := listener.Accept()
    if err != nil {
        log.Println("Accept error:", err)
        continue
    }
    go handleConnection(conn) // 并发处理每个连接
}
上述代码中,Accept() 调用默认为阻塞,但在底层可通过设置非阻塞标志配合事件循环实现高效调度。每个新连接由独立的 goroutine 处理,Go runtime 自动管理网络轮询。
  • 异步IO解耦了调用与完成时间
  • 文件描述符是内核资源的引用句柄
  • 事件多路复用器(如 epoll)支持 O(1) 复杂度监控成千上万连接

2.5 事件循环的停止与资源清理

在异步程序运行结束或发生异常时,正确停止事件循环并释放关联资源是保障系统稳定的关键环节。
优雅关闭事件循环
通过调用 loop.stop() 可主动终止事件循环。需注意,该方法不会立即中断正在执行的任务,仅阻止后续回调执行。
import asyncio

async def main():
    loop = asyncio.get_running_loop()
    # 延迟停止事件循环
    loop.call_later(2, loop.stop)
    while True:
        print("Event loop running...")
        await asyncio.sleep(1)

# 运行主协程
asyncio.run(main())
上述代码中,call_later 在2秒后调用 loop.stop(),循环将在当前迭代完成后退出。
资源清理机制
使用 try...finally 或异步上下文管理器确保套接字、文件等资源被正确关闭:
  • 注册 shutdown 回调函数处理清理逻辑
  • 取消未完成的任务以避免资源泄漏
  • 关闭事件循环前释放 I/O 句柄

第三章:底层架构与关键组件解析

3.1 SelectorEventLoop与ProactorEventLoop对比

在Python的asyncio框架中,SelectorEventLoop和ProactorEventLoop是两种核心事件循环实现,分别适用于不同操作系统和I/O模型。

I/O模型差异
  • SelectorEventLoop:基于select、poll、epoll或kqueue等系统调用,采用轮询方式监听文件描述符,跨平台兼容性好,适用于Unix/Linux和Windows。
  • ProactorEventLoop:基于Windows的IOCP(I/O Completion Ports)机制,使用异步I/O完成端口,真正支持内核级异步操作,仅限Windows平台。
性能与适用场景
特性SelectorEventLoopProactorEventLoop
平台支持跨平台仅Windows
I/O模型同步非阻塞 + 事件轮询异步I/O(IOCP)
吞吐量中等高
代码示例与分析
import asyncio
# 在Windows上显式使用ProactorEventLoop
if isinstance(asyncio.get_event_loop(), asyncio.ProactorEventLoop):
    print("Using ProactorEventLoop for async I/O")

上述代码检测当前事件循环类型。ProactorEventLoop在处理大量并发连接时性能更优,因其无需轮询,而是由操作系统通知I/O完成。而SelectorEventLoop依赖定时检查就绪状态,在高并发下可能成为瓶颈。

3.2 asyncio任务与Future对象源码探秘

在asyncio中,Task是Future的子类,用于封装协程的执行。当调用`asyncio.create_task()`时,事件循环会将协程包装为Task对象并调度执行。
Task与Future的关系
  • Future表示一个异步操作的最终结果
  • Task是绑定到特定协程的Future,具备自动调度能力
核心源码片段解析

class Task(Future):
    def __init__(self, coro, loop=None):
        self._coro = coro
        self._loop = loop or events.get_event_loop()
        self._context = contextvars.copy_context()
        # 初始化状态机
        self._state = _PENDING
        super().__init__(loop=loop)
上述代码展示了Task初始化过程:保存协程对象、获取事件循环,并继承Future的完成状态管理机制。通过`_step()`方法驱动协程逐步执行,最终通过`set_result()`或`set_exception()`改变Future状态,通知等待者。

3.3 句柄执行器与线程事件传递机制

在多线程编程模型中,句柄执行器(Handle Executor)承担着任务调度与资源管理的核心职责。它通过统一接口封装底层线程操作,实现事件的高效分发与执行。
事件注册与回调机制
每个句柄关联一个或多个事件监听器,当特定条件触发时,执行器将事件投递至目标线程队列。这种解耦设计提升了系统的可扩展性。
type Handler struct {
    OnEvent func(data interface{})
}

func (h *Handler) Execute(ctx context.Context, input interface{}) {
    select {
    case <-ctx.Done():
        return
    default:
        h.OnEvent(input)
    }
}
上述代码展示了句柄的基本执行逻辑:通过上下文控制生命周期,确保事件处理可在取消或超时时安全退出。OnEvent 作为回调函数,封装具体业务逻辑。
线程间事件传递模型
采用消息队列作为中间缓冲,避免直接线程耦合。事件按优先级排序,保障高时效任务优先处理。

第四章:高阶应用与性能优化实践

4.1 多线程与多进程中的事件循环管理

在并发编程中,事件循环是实现异步任务调度的核心机制。多线程环境下,每个线程可拥有独立的事件循环,但需注意线程安全问题。
事件循环在多线程中的分配
Python 的 asyncio 允许通过 asyncio.new_event_loop() 为不同线程绑定专属循环:
import asyncio
import threading

def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()

new_loop = asyncio.new_event_loop()
thread = threading.Thread(target=start_loop, args=(new_loop,), daemon=True)
thread.start()
该代码创建新事件循环并在独立线程中运行,实现非阻塞异步任务处理。参数 daemon=True 确保主线程退出时子线程随之终止。
多进程中的事件循环隔离
多进程间不共享内存,每个进程可独立运行事件循环,避免锁竞争,适合 CPU 密集型异步任务。

4.2 高并发场景下的性能瓶颈分析

在高并发系统中,性能瓶颈通常集中在I/O等待、锁竞争和资源争用三个方面。随着请求量上升,数据库连接池耗尽和线程上下文切换开销成为关键制约因素。
数据库连接池瓶颈示例
// 设置最大连接数为100
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(time.Hour)
当并发请求数超过100时,多余请求将阻塞在连接获取阶段,导致响应延迟急剧上升。合理配置连接池参数可缓解但无法根本解决瓶颈。
常见性能瓶颈分类
  • CPU密集型:加密计算、复杂算法处理
  • I/O密集型:数据库查询、远程API调用
  • 锁竞争:共享资源访问同步机制
典型响应时间变化趋势
并发用户数平均响应时间(ms)错误率(%)
100500.1
10008002.3
50005000+18.7

4.3 自定义事件循环策略提升效率

在高并发异步应用中,标准事件循环可能无法满足性能需求。通过自定义事件循环策略,可优化任务调度顺序与执行频率,显著提升系统吞吐量。
策略设计原则
  • 优先处理I/O密集型任务,减少等待时间
  • 动态调整事件轮询间隔,避免空转消耗CPU
  • 支持任务分组与优先级队列管理
代码实现示例
import asyncio

class CustomEventLoopPolicy(asyncio.AbstractEventLoopPolicy):
    def get_event_loop(self):
        loop = super().get_event_loop()
        loop.set_debug(True)  # 启用调试模式便于监控
        return loop

asyncio.set_event_loop_policy(CustomEventLoopPolicy())
该策略继承自AbstractEventLoopPolicy,重写核心方法以注入自定义逻辑。set_debug(True)启用事件循环的运行时检测,有助于识别延迟瓶颈。
性能对比
策略类型QPS平均延迟(ms)
默认策略850012.4
自定义策略117008.2

4.4 调试工具与运行时状态监控技巧

常用调试工具集成
现代开发环境中,调试工具是定位问题的核心手段。GDB、Delve 等命令行调试器支持断点、单步执行和变量查看,适用于服务端程序深度排查。

package main

import "fmt"

func main() {
    data := []int{1, 2, 3}
    for i := range data {
        fmt.Println(data[i]) // 设置断点观察 i 和 data[i]
    }
}
使用 Delve 可通过 dlv debug 启动调试,break main.go:6 设置断点,continue 触发执行。
运行时指标采集
通过 Prometheus + Grafana 构建监控体系,可实时观测 CPU、内存、协程数等关键指标。Go 程序可暴露 /metrics 接口供抓取。
指标名称含义采集方式
go_goroutines当前协程数量prometheus.ClientGolang
go_memstats_heap_inuse堆内存使用量自动暴露

第五章:总结与展望

性能优化的持续演进
现代Web应用对加载速度和运行效率提出更高要求。采用代码分割(Code Splitting)结合动态导入,可显著减少初始包体积。例如,在React项目中使用如下模式:

const LazyComponent = React.lazy(() => import('./HeavyComponent'));

function App() {
  return (
    <Suspense fallback="Loading...">
      <LazyComponent />
    </Suspense>
  );
}
该方式配合Webpack的分块策略,实现按需加载,提升首屏渲染性能。
可观测性体系构建
生产环境的稳定性依赖于完善的监控机制。以下为前端埋点数据采集的关键指标分类:
指标类别采集方式典型工具
页面加载性能Performance APILighthouse, Sentry
用户交互行为事件监听 + 上报队列Amplitude, Mixpanel
JS错误与堆栈window.onerrorBugsnag, Rollbar
微前端架构的落地挑战
在大型组织中,微前端成为解耦团队协作的有效方案。通过Module Federation实现跨团队模块共享:
  • 主应用定义共享运行时(如React、Lodash)
  • 子应用独立部署,通过远程入口注册到容器
  • 利用自定义事件或状态管理实现通信
  • CI/CD流程需支持独立构建与灰度发布
某电商平台采用此架构后,将发布周期从双周缩短至每日多次,同时降低核心模块的耦合风险。

相关推荐

协程 3 —— 事件循环(asyncio)核心原理

事件循环(Event Loop)是异步程序的核心调度器,负责在单线程内管理协程的执行、I/O事件监控及回调触发。

riven78的博客 1163

Python asyncio 库源码分析

本着 「路漫漫其修远兮, 吾将上下而求索」 的精神。终于要开始深入研究 Python 中 asyncio 的源码实现啦。本文章可能篇幅较长,因为是逐行分析 asyncio 的实现,也需要读者具有一定的 asyncio 编码经验和功底,推荐刚开始踏上 Python 异步编程之旅的朋友们可以先从官方文档入手,由浅入深步步为营。若在读的你对此感兴趣,那么很开心能与你分享我的学习成果。本次源码分析将在 Python 3.11.3 的版本上进行探索。

woaimx_1314的博客 1087

基于asyncio库实现Python协程(Coroutines)及源码解析

asyncio是什么(官方文档入口) asyncio is a library to write concurrent code using the async/await syntax. 官方文档里给的定义如上,简单来说就是用asyncio库里的async/await 语法来写一个异步代码。 asyncio库通常用来写高性能网络、web服务器、分布式任务队列等Python异步框架。 使用async/await创建一个简单的协程用例 import asyncio import time asy.

weixin_44333824的博客 694

python asyncio模块源码一点分析

理解asyncio模块的运行逻辑

Atlantic1906的博客 1222

DIOCP5最新版高性能I/O框架发布

作为测试宿主,SR32.exe的核心任务是充当一个可控的 TCP/UDP 服务节点,用以评估 DIOCP5 框架在各种负载条件下的稳定性与吞吐能力。其典型应用场景包括:压力测试:配合外部负载生成器(如 JMeter 或自定义客户端)模拟数十万甚至百万级并发连接。协议兼容性验证:通过定制数据包处理逻辑,验证框架对特定通信协议(如 HTTP、WebSocket、私有二进制协议)的支持程度。异常注入测试:人为制造连接中断、数据乱序、超时等异常情况,检验框架的容错机制。

weixin_42513209的博客 965

EventualPy:最终实现一致性的python asyncio练习

终极派 最终实现一致性的python asyncio练习。 从较旧的C#实现移植: 领域 面向域是一个包含两个主要参与者服务的业务环境: 数据输入服务,生成需要某种形式的注释的字段 注释服务,将为任何字段提供注释 目的是确保所有创建的字段最终都具有数学上的置信度。 为实现该目标,实施了以下流程: 基于事件(及时) 发布新字段以进行注释 发布已创建字段的新注释 确认已成功保存在数据输入服务中的注释 基于状态(批量重试) 重新发布未注释的字段以进行注释 重新发布已创建字段的未确认注释 业务流程 快乐之路 现实之路 锻炼 在单个过程中协调了分布式服务体系结构。 以下变量用于调整实现两个服务之间最终一致性所需的时间。 要创建的字段数,以及创建它们的间隔 从数据输入服务重新发布未注释字段的速率 批注服务重新发布的未确认批注的比率 以下每个操作的失败率: 为从数据输入服务发布到注释服务的

7.asyncio库详解

asyncio是 Python 3.4 引入的标准库,用于编写协程和异步代码。它基于事件循环(Event Loop)的概念,通过异步任务(coroutines)和 Future 对象来实现非阻塞的并发操作。异步编程的目标是提高代码执行效率,特别是在需要等待 I/O 操作(如网络请求、文件读写等)时,能够释放 CPU 资源,从而提高程序的并发性能。返回一个包含已完成和未完成任务的元组。返回一个包含所有协程结果的列表。允许你设置等待条件,可以等待任意一个或全部协程完成,或者等待第一个异常。

weixin_39987031的博客 803

Python-asyncio源码注解

asyncio 源码注解.

Python asyncio高级编程:事件循环与并发控制

本文深入解析Python asyncio库的高级特性,重点介绍事件循环的精细控制和使用方法。主要内容包括:1) 事件循环生命周期的四个阶段(创建、配置、运行和关闭),以及Python 3.7+的简化API;2) 无限循环任务的实现方式,包括单任务周期性执行和多任务协调;3) 事件循环的高级配置选项;4) 普通函数的事件循环调度机制,如call_soon()的立即执行和call_later()的延迟执行。通过代码示例展示如何高效利用asyncio构建并发应用,适合希望提升异步编程技能的开发者。

高压锅博客 461

详解python异步编程之asyncio(百万并发)

前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病。然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板,如最新的微服务框架japronto,resquests per second可达百万级。 python还有一个优势是库(第三方库)极为丰富,运用十分方便。asyncio是python3.4版本引入到标准库,python2x没有加这个库,毕竟python3x才是未来啊,哈哈!python3.5又加入了async/await特性。 在学习asyncio之前,我们先来理清楚同步/异步的概念: 同步是指完成

Python中asyncio模块的深入讲解

主要给大家介绍了关于Python中asyncio模块的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

python协程系列(六)——EventLoop和Future详解以及concurrency实现

python进阶教程机器学习深度学习长按二维码关注进入正文python协程系列(六)——asyncio的EvenrLoop以及Future详解声明:python协程系列文...

MIss-Y的博客 1360

Python中的asyncio代码详解

asyncio介绍 熟悉c#的同学可能知道,在c#中可以很方便的使用 async 和 await 来实现异步编程,那么在python中应该怎么做呢,其实python也支持异步编程,一般使用 asyncio 这个库,下面介绍下什么是 asyncio : asyncio 是用来编写 并发 代码的库,使用 async/await 语法。 asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。 asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。 asyncio中的基本概念 可以看见,使用asyncio库我们

Python 异步编程完全指南:从入门到精通

本文全面介绍Python异步编程的核心概念与实践方法。文章首先通过餐厅点餐的类比,生动解释了同步与异步的区别,并对比了不同执行模型的效率差异。然后详细讲解了Python中async/await语法和协程的基本用法,通过代码示例展示了同步与异步版本的显著性能差距(3秒 vs 1秒完成相同任务)。文章深入剖析了asyncio的事件循环机制、任务调度原理等核心概念,并提供了从简单到复杂的实战案例。最后总结了异步编程的高级技巧、常见陷阱及生态工具,帮助开发者彻底掌握这一提升程序性能的关键技术。

yweng18的博客 499

抖音直播小风车跳转企业微信全攻略:企业号申请+落地页配置详解

本文详细解析了抖音直播小风车跳转企业微信的全流程,包括企业号申请、小风车配置和落地页优化。通过实战指南,帮助企业高效实现私域流量沉淀,提升直播转化率,特别适合电商和营销从业者参考。

weixin_29289821的博客 616

GD32F303 ADC+DMA实战:用硬件过采样搞定多通道数据采集(附完整代码)

本文详细介绍了GD32F303系列MCU通过ADC+DMA结合硬件过采样技术实现多通道数据采集的实战方案。从硬件设计要点到软件配置全解析,包括时钟树配置、ADC模块初始化和DMA传输设置,提供了完整的代码示例和优化技巧,帮助工程师构建高精度、低功耗的数据采集系统。

weixin_30466039的博客 322

python asyncio原理_Asyncio 源码分析

python 中的协程从我个人的理解来说一说 python中的协程,我们知道 linux 中的线程比进程轻量级,切换成本低,协程比线程更轻量级。所以切换成本耕地,是基于生成器来实现的也就是 yield 语句,后来又有 yeild from 子协程的语法出现,生成器是迭代器,迭代器不是生成器,生成器能够输出值,也可以接收值,可以 hang/resume。当然在 python3.5 使用了新的语法 a...

weixin_39568889的博客 641

银河麒麟系统完美安装EasyConnect

Kylin V10桌面版完美安装EasyConnect

weixin_53874797的博客 1万+

python asyncio_Python | asyncio:从原理、源码到实现

选自《源码读Python》作者:闲谈后https://zhuanlan.zhihu.com/p/64991670去年的这个时候吧,我开始找工作,招聘启事上说,需要了解 asyncio。我回去翻了翻书,orz·····今年,在一次内部技术分享会上,我要分享的内容涉及到一些 python 协程,我又去看 asyncio 的文档。结果依旧是 orz ····无奈,我将 asyncio 的源码通读了一遍,...

weixin_39781209的博客 382

电磁场仿真软件:Sonnet_(1).Sonnet软件概述

根据特定需求自定义仿真流程,如多频率点仿真、多边界条件仿真等。

kkchenjj的博客 1452

[QMT和ptrade量化交易小白入门]-112、小市值热点概念交易策略,回测5年20倍

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1083

python3.6异步IO包asyncio部分核心源码思路梳理

关于python异步编程的演进过程,两篇文章阐述得妥妥当当,明明白白。 中文资料:https://mp.weixin.qq.com/s?__biz=MzIxMjY5NTE0MA==&mid=2247483720&idx=1&sn=f016c06ddd17765fd50b705fed64429c 英文资料:http://aosabook.org/en/500L/...

weixin_30364325的博客 226

备赛电赛学习硬件篇(六):复位电路工作原理

上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。

m0_61022809的博客 6774

aiohttp

asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。 asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。

cabbage2008的专栏 2127

Onnxruntime之YOLOP部署过程记录

魔改YoloP部署过程记录

如果想成为中心,那么就到中心去吧。 1930

lammps构建高熵合金模型+结构优化初步筛选能量最小的结构

lammps构建高熵合金模型+结构优化初步筛选能量最小的结构

qq_45834835的博客 2605
上一篇: 【限时收藏】LightGBM调参黄金法则:6组高阶参数组合大公开
下一篇: 【Bottle生产环境部署秘籍】:避开99%新手都会踩的性能陷阱
LiteCode
博客等级 码龄1年 146粉丝 2019原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值