简单理解 Python EventLoop 事件循环

高并发神器:深入解析 Python Asyncio 事件循环调度原理 本文深入解析了Python Asyncio事件循环的调度原理,帮助开发者掌握异步编程的核心技术。文章首先介绍了事件循环的基本概念及其在异步任务调度、I/O操作管理中的作用,并通过代码示例展示了如何使用asyncio.get_event_loop()创建和运行事件循环。接着,详细探讨了Task与Future的任务调度机制,解释了如何通过asyncio.create_task()和Future.set_result()来管理和执行异步任务。 阅读详情

简介

在 python 3中,加入了 asyncio 模块,来实现协程,其中一个很重要的概念是事件循环,整个异步流程都是事件循环推动的。下面自己实现一个相对简单的EventLoop,了解一下事件循环是如何进行运转的。

事件循环

下面看一下整个流程的实现过程

将以下代码写入 spider_event_loop.py 文件:

# spider_event_loop.py

import time
import os
import socket
from urllib.parse import urlparse
from collections import deque
from selectors import DefaultSelector, EVENT_WRITE, EVENT_READ

# selector = DefaultSelector()
urls = ['https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9bc51bc53f634bf79b5de5c8b9810817~tplv-k3u1fbpfcp-watermark.image',
        'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2b95ac8571ba403180743495ed56e492~tplv-k3u1fbpfcp-watermark.image',
        'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/459c6c73887a4206a33b13ef23988809~tplv-k3u1fbpfcp-watermark.image',
        'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/80701ade82d345cd8aa0b08fef008fe1~tplv-k3u1fbpfcp-watermark.image',
        'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/99855ed1f79c456f9fdcd83ce5cff4f2~tplv-k3u1fbpfcp-watermark.image',
        'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0c4bd38c2fe3434587025748d051362e~tplv-k3u1fbpfcp-watermark.image',
        'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/80cd2a1d165b43beb6234d893ce391e2~tplv-k3u1fbpfcp-watermark.image',
        'https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ea18df95f26f4314a0a36d11d4a067d0~tplv-k3u1fbpfcp-watermark.image',
        'https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/095c342a796c411cad1800396746bdaf~tplv-k3u1fbpfcp-watermark.image',
        'https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d3769e4d468a4f64a1e2879f94ad742b~tplv-k3u1fbpfcp-watermark.image'
]

# 事件循环实现
class EventLoop:

    def __init__(self):
     	# 整个流程是否
        self._stopped = False
        self._ready = deque()
        self._selector = DefaultSelector()

    # 向 _ready 队列中加入回调方法
    def call_soon(self, callback, *args):
        # 将事件添加到队列里
        handle = Handle(callback, self, *args)
        self._ready.append(handle)

    # 套接字注册读事件
    def add_writer(self, fd, callback, *args):
        # 将回调方法封装成Handle
        handle = Handle(callback, self, *args)
        
        try:
            # 检查有没有注册过
            key = self._selector.get_key(fd)
        except KeyError:
            # 没有注册过,进行写事件注册
            self._selector.register(fd, EVENT_WRITE, handle)
        else:
            # 注册过,添加写事件
            mask = key.events
            self._selector.modify(fd, mask | EVENT_WRITE, handle)
    
    # 套接字注销读事件
    def remove_writer(self, fd):
        try:
            # 检查有没有注册过
            self._selector.get_key(fd)
        except KeyError:
            # 没有,直接返回
            return
        # 注销事件
        self._selector.unregister(fd)

    # 套接字注册写事件
    def add_reader(self, fd, callback, *args):
        # 将回调方法,封装成Handle
        handle = Handle(callback, self, *args)
        try:
            # 检查是否注册过
            key = self._selector.get_key(fd)
        except KeyError:
            # 没有注册过,进行读事件注册
            self._selector.register(fd, EVENT_READ, handle)
        else:
            # 注册过,添加读事件
            mask = key.events
            self._selector.modify(fd, mask | EVENT_READ, handle)

    # 套接字注销写事件
    def remove_reader(self, fd):
        try:
            # 检查有没有注册过
            self._selector.get_key(fd)
        except KeyError:
            # 没有,直接返回
            return
        # 注
Python asyncio库核心源码解析 0 前言 Python asyncio库是由Python之父Guido亲自主持开发的Python异步I/O库,Python3.6之后已正式成为标准库中的一员,其提供了async/await语法支持原生协程,使得在Python中进行异步编程变得非常简单。 阅读这篇文章之前最好先阅读文章深入理解Python异步编程,了解一下Python异步编程的发展过程。早期,Python是基于生成器和事件循环来实现的异步编程,当前的async/await原生协程的内部实现机制和早期的基于生成器的实现方案其实也是基本一致的, 阅读详情

相关推荐

理解 asyncio 来构建高性能 Python 网络程序 - Ricequant米筐量化

Python 是一门上手快、优雅简洁的编程语言,其多范式、丰富的标准库和第三方库能够让编程人员把精力集中在逻辑和思维方法上,而不用去担心复杂语法、类型系统等外在因素,从而高效地达成自己的编程目标。Python 抽象层次非常高,这帮助我们更好更快地完成编程,但也屏蔽了很多细节,程序员也无法精确控制计算机底层的资源,代码性能优化就变得比较复杂。很多资深的程序员可能会觉得 Python 性能不够好,无法编写高性能的程序,其实这句话也不全对。对于计算密集型的程序,Python 可以通过扩展的形式使得核心计算直接调用

Ricequant的博客 690

Python事件驱动编程:从概念到asyncio实战

事件驱动编程是一种核心的软件设计范式,它将程序执行流程从主动的顺序执行转变为被动的响应模式。其基本原理围绕事件循环、事件和回调函数三个核心概念展开:事件循环作为总调度中心,持续监听并分发各类事件;事件作为程序内外状态变化的载体;回调函数则负责具体的事件处理。这种模型的技术价值在于能够高效处理大量并发I/O操作,避免线程阻塞,显著提升资源利用率。其典型应用场景包括图形用户界面开发、网络服务器和高并发I/O密集型应用。在Python生态中,从tkinter的GUI事件绑定到现代asyncio库的async/aw

weixin_34075268的博客 427

2024年Python最新JavaScript之彻底学会Event Loop(1),6年老Python面经总结

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。最近我才对这些路线做了一下新的更新,知识体系更全面了。

m0_61549674的博客 985

Python并发优化实战:多线程 vs 多进程 vs asyncio 性能对比

本文对比Python三种并发方案性能差异:多线程、多进程和asyncio协程。通过模拟10个1秒任务的测试显示,单线程耗时10秒,而三种并发方案均只需约1秒完成。关键结论:IO密集型任务推荐多线程或asyncio,CPU密集型任务应选用多进程。实际项目中可组合使用,如Web接口用asyncio、AI计算用多进程。合理选择并发模型能显著提升Python程序性能,需根据任务类型选择最佳方案。

qq_37377812的博客 273

C++实现高性能HTTP服务器:从Reactor模型到高并发优化

网络编程是现代软件开发的基石,其核心在于高效处理大量并发连接。I/O多路复用技术,如Linux的epoll,通过Reactor模式实现单线程管理多个连接,解决了传统阻塞I/O的性能瓶颈。这种模型在构建高性能服务器时至关重要,能显著提升吞吐量和资源利用率。在实际工程中,结合对象池、缓冲区复用等优化手段,可进一步减少内存分配开销。这些技术广泛应用于需要极致性能的场景,如高频交易、实时通信和嵌入式系统。本文聚焦于使用C++从零构建一个可嵌入的HTTP/1.1服务端,深入探讨epoll事件驱动、HTTP协议解析以及

dfdfadsf3443的博客 415

从零构建高性能C++文件上传服务器:Reactor模型与HTTP协议解析实战

文件上传是网络应用开发中的基础功能,其核心在于高效处理网络I/O与磁盘I/O。理解其原理需要从HTTP协议入手,特别是multipart/form-data格式的解析,这直接关系到数据传输的完整性与安全性。在技术实现层面,Reactor事件驱动模型通过单线程或少量线程管理海量连接,配合epoll等I/O多路复用技术,能显著提升高并发场景下的吞吐量与资源利用率。这种架构的价值在于为直播弹幕图片、物联网数据回传等大流量场景提供了可控的高性能解决方案。本文聚焦于如何基于C++手动实现一个完整的文件上传服务器,深入

324

Claude Opus 4代码能力栈:深度理解、精准生成与上下文调试

大模型代码能力已从基础语法补全,演进为涵盖语义理解、工程上下文建模与调试推理的综合技术体系。其核心价值在于突破传统IDE插件的上下文断裂瓶颈,实现对项目配置、依赖关系、运行环境乃至团队规范的联合建模。关键技术支撑包括长上下文(100K token)下的跨文件控制流追踪、基于真实工程约束的重构决策、以及融合日志/配置/环境特征的根因诊断能力。典型应用场景覆盖遗留系统迁移、安全合规加固、测试用例生成及中级开发者赋能。Claude Opus 4与原生Code能力栈的结合,正重新定义AI结对编程的技术边界。

weixin_30781107的博客 315

Ubuntu 12.04 安装 Salt 2015.5.10 实战指南

Salt 是一款基于 ZeroMQ 和 Python 的分布式远程执行与配置管理工具,其核心价值在于通过事件驱动架构实现毫秒级命令下发与状态同步。在老旧系统运维场景中,Salt 对 Python 2.7 环境、低版本 OpenSSL 及旧版 ZeroMQ 的兼容性设计,决定了它仍是 EOL 系统(如 Ubuntu 12.04)唯一可行的自动化纳管方案。本文聚焦 Salt 2015.5.10 这一官方支持 Ubuntu 12.04 的最终稳定版本,详解其与 msgpack-python 0.4.8、pyzmq

weixin_33767813的博客 398

Python ThreadPoolExecutor 并发编程核心原理与生产实践

ThreadPoolExecutor 是 Python 3 标准库中专为 I/O 密集型任务设计的高层线程池抽象,其本质是基于资源池化与 Future 异步契约的任务生命周期管理模型。它通过复用 OS 线程降低创建开销,并以非阻塞方式解耦任务提交与结果获取,显著提升 API 调用、文件读写、数据库查询等场景的吞吐能力。相比原始 threading,它内置异常传播、超时控制与统一关闭机制;相比 asyncio,则无需协程改造即可安全集成阻塞式库(如 requests)。在 Python 3.8+ 中 max_

334

使用python-aiohttp搭建微信公众平台

aiohttp是一个基于asyncio的异步http框架,在高并发的情况下具有很好的性能,这也是我选择使用aiohttp来搭建微信公众平台的原因。

SigalHu 5232

现代C++高性能系统开发:从泛型编程到实战优化

泛型编程作为编译期抽象的核心技术,通过模板元编程实现了零成本抽象,在保证类型安全的同时避免了运行时开销。其技术价值在于能够构建高度灵活且性能优异的系统组件,广泛应用于基础设施库、游戏引擎和金融交易系统等对性能有极致要求的场景。内存管理是系统性能的关键,现代C++提供了智能指针和自定义分配器等工具来优化资源使用。在高性能系统开发中,合理运用泛型编程和精细的内存控制,可以有效提升程序的执行效率和资源利用率,满足现代软件对性能和可靠性的双重需求。

weixin_34319111的博客 394

深入理解 asyncio 事件循环:高并发任务调度的核心机制

本文深入探讨了 Python 中 asyncio 事件循环的核心机制及其在高并发任务调度中的应用。asyncio 通过事件驱动模型,利用协程和任务实现非阻塞的异步编程,适用于 I/O 密集型任务如网络请求和数据库查询。文章详细介绍了事件循环的工作流程、协程与任务的区别,以及如何通过 asyncio.gather() 和 asyncio.create_task() 实现并发任务调度。此外,还提供了异步 I/O 和事件循环优化的示例代码,帮助开发者更好地理解和应用 asyncio 提升系统性能。

铭渊老黄 205

Python 异步代码踩坑实录:EventLoop 嵌套、协程泄漏与 uvloop 调优实测

Python异步编程实战避坑指南 本文深入剖析Python异步编程中的三大典型问题:EventLoop嵌套报错、协程泄漏和性能瓶颈。通过底层原理分析和实战代码演示,提供针对性解决方案: EventLoop嵌套问题:解释单线程单EventLoop限制,提供3种解决方案(直接await、run_coroutine_threadsafe和多线程隔离) 协程泄漏问题:分析协程生命周期,揭示未完成协程导致内存泄漏的机制,给出监控和回收策略 性能调优方案:对比默认EventLoop与uvloop性能差异

网络工程师|十多年企业级运维实战|精通 ‌BGP、OSPF、VLAN、SDN、MPLS、ACL、NetFlow、SNMP、 407

014-0501-Web-FastAPI&SQLAlchemy

本文基于FastAPI构建高性能Web服务,采用异步协程编程模式,依托Uvicorn服务器实现高并发处理。通过async/await机制与事件循环(EventLoop)高效调度任务,避免线程阻塞,显著提升I/O密集型场景下的响应能力。结合SQLAlchemy ORM进行数据库交互,实现模型与表的映射,并利用依赖注入管理数据库会话,确保数据操作安全可靠。整体架构兼顾性能与可维护性,适用于现代异步API开发。

38

微动探测原理及仪器介绍

微动探测原理及仪器介绍 1、微动探测原理 1.1 基本理论 微动是由体波和面波组成,其中微动能量的百分之七十以上都来自于面波,并且它与体波的主要区别是在不均匀的介质中传播时面波会发生频散,而体波不存在频散现象,因此面波是微动探测的主要对象。 对于介质的弹性参数(如横波速度、层薄厚、压缩波速度、密度等),面波传播速度相对比较敏感,特别是对横波的敏感性很高,因此可以利用面波来反演横波速度。 在时间和空间上,微动信号具有以下特性:高度变化、无规律性、无重复性等,有研究发现全世界各处记录的微动信号都有相似

zw461450141的博客 1万+

【OpenCV】背景替换(opencv、python),照片、证件照的背景替换(抠图)

目录步骤:导入库1、读入将要抠图的图片2、create一个带颜色域的mask3、通过mask使得原图只显示汽车,即抠出所需要的部分4、将要替换掉的图像resize或裁剪到和上述图片一样的大小5、将该图片预留出将要重叠上的部分,即将mask部分改为(0,0,0)6、通过和运算使得两部分图片mask部分替换7、最后保存图片 步骤: 导入库 import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np imp

weixin_41729258的博客 4361

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4330

Joule 终于会说 ABAP 了:从 ADT 提效到 ABAP AI SDK + ISLM 自建企业级 AI 场景的落地路线

生成结构化摘要(故障现象、初步原因、处理动作、备件消耗)自动给出建议分类(电气、机械、软件、网络)把摘要回写到工单抬头,方便后续统计与知识沉淀如果你用 CAP 来做这类服务,通常会在 Node.js 层封装一个对 AI Hub 的调用,再通过 OData 或 Event 把结果写回 SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

华为OD机试 - 天然蓄水库(Java 2025 A卷 100分)

例如,当山脉为s = [3, 1, 2]时,则选取s[0]和s[2]作为水库边界,则蓄水量为1,此时输出:0 2:1。选取下标 0(高度 3)与 2(高度 2)为边界,水位为 min(3,2)=2;选取山脉上两个点作为蓄水库的边界,则边界内的区域可以蓄水,蓄水量需排除山脉占用的空间。经过分析,选取s[1]和s[6]时,水库蓄水量为19(3 + 7 + 4 + 5)。当存在合理的水库边界时,输出左边界、空格、右边界、英文冒号、蓄水量;当山脉`s = [3, 2, 1]时,不存在合理的边界,此时输出:0。

学Java,找哪吒 938

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

18、深入解析航空飞行数据中的秘密:从数据清理到高级分析

本文详细解析了如何使用R语言处理和分析航空飞行数据,从基础的数据清理到复杂的回归分析和机器学习模型构建。文章涵盖了探索性数据分析、天气数据的整合、地理信息可视化、时间序列预测以及航班延误的优化策略等内容,展示了如何通过数据挖掘技术提高航空运营效率和乘客满意度,并探讨了数据质量评估与隐私保护的重要性。

convnet3designer的博客 106

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 爬虫现在还有那么吃香嘛?
下一篇: 一文带你解读Python常用数据结构之集合
Python_P叔
博客等级 码龄3年 5447粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值