greenlet实现协程

python协程的实现(greenlet源码分析) 基本上读完了greenlet的源代码,代码不多,就2000行C语言的代码,其中有一部分栈寄存器的修改的代码是由汇编实现的。。。 一句话来说明greenlet的实现原理:通过栈的复制切换来实现不同协程之间的切换。。。 那么接下里来具体的来看看greenlet的代码到底是怎么实现的。。。 阅读详情

greenlet实现协程

greenlet+switch机制来实现协程

greenlet用于创建协程,switch用于进行协程之间的切换某个协程在执行的过程中可以随时的被其他协程通过switch函数来打断,转而去执行其他协程,当前协程的中断现场会被保留,一旦中断的协程再次获得cpu的执行权首先会恢复现场然后从中断处继续执行
这种机制下的协程是同步,不能并发

from greenlet import greenlet
from time import sleep
def func1():
    print("协程1")
    sleep(2)
    g2.switch()
    print("协程1恢复运行")

def func2():
    print("协程2")
    sleep(1)
    g3.switch()
def func3():
    print("协程3")
    sleep(1)
    g1.switch()

if __name__ == '__main__':
    # 使用greenlet来创建三个协程
    g1 = greenlet(func1)
    g2 = greenlet(func2)
    g3 = greenlet(func3)
    # print(g1)
    g1.switch() # 让协程g1取抢占cpu资源
'''
协程1
协程2
协程3
协程1恢复运行
'''

gevent创建协程

import gevent
from time import sleep
def func1():
    print("协程1")
    sleep(2)
def func2():
    print("协程2")
    sleep(1)
def func3():
    print("协程3")

if __name__ == '__main__':
    # 用gevent来创建三个协程
    g1 = gevent.spawn(func1)
    g2 = gevent.spawn(func2)
    g3 = gevent.spawn(func3)

    # 将三个协程加入同步对列中
    gevent.joinall([g1,g2,g3])
    # gevent+同步对列机制
    # 通过gevent创建协程,然后把协程加入到同步队列中,就可以头同步执行
'''
协程1
协程2
协程3
'''

gevent+monkey


# 协程被创建出来以后默认是多个协程同步执行
# 我们可以加入monkey补丁,把同步的协程转成异步协程
from gevent import monkey	#注意:monkey的引入必须在其他模块之前
monkey.patch_all() # 用monkey给整个协程队列,添加一个非阻塞I/O的补丁,使得他们成为异步协程
import requests
import gevent
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

def func(url,i):
    print("协程%d开启!"%i)
    res = requests.get(url=url,headers=headers)
    html = res.text
    print("协程%d执行结束,获取到的响应体大小为:%d"%(i,len(html)))
if __name__ == '__main__':
    urls = [
        "https://www.baidu.com/",
        "https://www.qq.com/",
        "https://www.sina.com.cn",
        "https://www.ifeng.com/",
        "https://www.163.com/"
    ]
    # 创建5个协程分别对上面5个网站进行访问
    g_list = []
    for i in range(len(urls)):
        g = gevent.spawn(func,urls[i],i)
        g_list.append(g)
    gevent.joinall(g_list)
'''
协程0开启!
协程1开启!
协程2开启!
协程3开启!
协程4开启!
协程0执行结束,获取到的响应体大小为:156719
协程4执行结束,获取到的响应体大小为:675831
协程3执行结束,获取到的响应体大小为:218003
协程2执行结束,获取到的响应体大小为:579035
协程1执行结束,获取到的响应体大小为:232192
'''

Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务用法详解 本文实例讲述了Python 协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法。分享给大家供大家参考,具体如下: 实现多任务:进程消耗的资源最大,线程消耗的资源次之,协程消耗的资源最少(单线程)。 gevent实现协程,gevent是通过阻塞代码(例如网络延迟等)来自动切换要执行的任务,所以在进行IO密集型程序时(例如爬虫),使用gevent... 阅读详情

相关推荐

百度慧眼人口位置数据:从原理到实战的GIS处理全流程

本文详细解析百度慧眼人口位置数据的处理全流程,从基本原理到实战应用。通过空间网格划分、终端数量统计等技术手段,百度慧眼数据能准确反映人群分布特征。文章涵盖坐标系转换、核密度分析、热力图制作等GIS处理技巧,并分享商业选址、城市规划等典型业务场景的解决方案,帮助读者高效利用这一数据资源。

weixin_30872157的博客 534

协程 与 greenlet

文章目录1. 协程2. greenlet 1. 协程 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别...

一只程序猿 499

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 261

Python协程技术:从Greenlet到async/await的异步编程探索

本篇博客深入讨论了Python中的协程技术,以及使用不同工具和语法实现协程的方法。首先,我们介绍了Greenlet和yield,解释了协程的基本概念和原理,并展示了手动切换上下文以实现协程交替执行的案例。接下来,我们引入了Python标准库的asyncio模块,展示了如何使用其中的协程和事件循环来实现并发和异步操作。最后,我们探讨了Python 3.5版本引入的async/await关键字,展示了如何使用它们来定义和调度协程,以实现简洁高效的异步编程。

ak_bingbing的博客 646

邮件伪造和SPF

之前看了下邮件伪造觉得挺有意思的,所以看了下邮件伪造的东西,下面简单的总结了一下,如果有不妥的地方还望大佬们提出来。 1. 什么是SPF SPF是 Sender Policy Framework 的缩写,一种以IP地址认证电子邮件发件人身份的技术,是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录。 接收邮件方会首先检查域名的SPF记录,来确定发件人的IP地址是否被包含在SP...

SunJ3t的菠萝屋 2448

振动分析中相位的确定

更是定位不平衡量角度的关键。是确定振动信号与转子旋转位置之间时间关系的核心步骤,而。以内,以确保校正配重安装角度的有效性。在实际动平衡中,相位角的误差需控制在。在振动分析和动平衡中,

轩辕霸天L 2735

Python--协程(greenlet 模块、Gevent 模块)

协程介绍以及特点;greenlet 模块;Gevent 模块;

weixin_43988680的博客 969

MiniMax H3 + ComfyUI 工作流搭建指南:从整合包到视频生成

AI视频生成正成为内容创作的新基础设施,而ComfyUI作为可视化工作流引擎,将复杂的模型推理过程拆解为节点与连线,让本地视频生成变得可复用、可批量。理解这一原理后,用户无需编写代码,只需掌握模型加载、提示词控制、采样与解码的基本链路,即可搭建出稳定的视频生产管线。MiniMax H3作为前沿视频生成模型,在ComfyUI中通过权重文件和自定义节点落地,配合整合包可大幅降低环境配置门槛。从硬件评估、目录结构到节点连接与参数调优,本文系统性梳理了从零跑通一条视频生成工作流的完整路径,帮助用户在批量素材生成、风

weixin_29057065的博客 414

greenlet 详解

   在前面的文章中提到python原生的generator是semicoroutine,而greenlet是 真 协程。本文内容主要来自对官网文档的翻译,在其中也加入了很多自己的理解和例子。主要包括以下内容:什么是greenlet,greenlet的切换与函数调用的区别,greenlet的生命周期,以及使用greenlet的注意事项。 greenlet初体验   Greenlet是pytho...

weixin_34074740的博客 317

unity转微信小游戏:使用CDN加载游戏(微信开发者工具云开发CDN)

unity转微信小游戏:使用CDN加载游戏(微信开发者工具云开发CDN)

会潜水的小火龙的博客 3072

【C语言项目合集】这十个入门必备练手项目,让C语言对你来说不再难学!

适合刚入门C语言的编程学习小白的十个练手项目,每个都很经典且实用,让你学完C语言不再迷茫!

kxtxdy的博客 3万+

Python:协程,用yield和greenlet方式创建协程

IO特别多时,因为Python有GIL(全局解释器锁)在同一时间内实际只有一个线程在工作(IO操作,切换保存状态耗费时间),多线程的执行效率比协程会更低。优点:通过对象,switch(),来实现任务的切换,需要导入greenlet模块#pip install greenlet。存在意义:多线程:分时切片,串行并发操作,线程切换需要耗费时间(保存状态)w1.switch()#切换到w1运行,告诉程序先从哪个任务开始执行。协程:单线程下的并发,又称为微线程,纤程,是一种用户态轻量级线程。

2302_80457734的博客 364

华为OD机试真题 新系统【查找温度记录统计信息】

华为OD机试 新系统真题【查找温度记录统计信息】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找温度记录统计信息】多语言题解。

qq_45776114的博客 486

Python协程greenlet实现原理

原文链接:点击打开链接摘要: [greenlet](https://github.com/python-greenlet/greenlet)是[stackless Python](https://wiki.python.org/moin/StacklessPython)中剥离出来的一个项目,可以作为官方CPython的一个扩展来使用,从而支持Python协程。[gevent](http://www...

qq_40954115的博客 281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

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

python之greenlet实现协程

greenlet+switch机制来实现协程 greenlet用于创建协程,switch用于进行协程之间的切换某个协程在执行的过程中可以随时的被其他协程通过switch函数来打断,转而去执行其他协程,当前协程的中断现场会被保留,一旦中断的协程再次获得cpu的执行权首先会恢复现场然后从中断处继续执行 这种机制下的协程是同步,不能并发: from greenlet import greenlet ...

我愿做一个聆听者,以学习为伴! 304

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

原生协程及greenlet框架实现

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存,在调度回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,即所有局部状态的一个特定组合async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。

4年Python老司机|从2.8版本卷到3.13 真正的全栈是:能用Vue写前端,能用Python调参,还能用Redis解决人生选择困难症 463

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

协程,greenlet使用,gevent实现异步应用

2,使用基于gevent的高效协程自动切换,不需要我们使用switch去切换。3,只在遇到阻塞的时候切换,没有轮询的开销,也没有线程的开销。3.缺点:协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程 ,协程指的是单整个线程个线程,因而一旦协程出现阻塞,将会阻塞。2.优点:协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 ,单线程内就可以实现并发的效果,最大限度地利用cpu。1.协程概念:是单线程下的并发,又称微线程。

Dxh0112_的博客 1107

python下协程实现原理与greenlet源码解析

对main task的初始化与task的初始化不同,初始化main task不用设置run属性 (grennlet的callback函数),稍后介绍普通task的初始化时会提到run属 性.maintask对greenlet框架的使用者是透明的,在import greenlet时会执行初 始化操作,每个线程都可以有自己的main task,它的stack_stop属性永远 为-1, stask_start属性永远为1。

weixin_60223182的博客 777

python3协程的使用,yield、greenlet和gevent实现协程,及协程的一些使用环境

实现多任务的方式:多线程和多进程 协程,又称微线程,在不开辟多个线程的情况下,让多个任务交替执行 , 由于协程不会开辟多个线程,所以当一个线程下有多个协程时,同一时间只会有一个协程正在执行。 通过yield来实现协程 代码执行到yield会暂停,然后把结果返回出去,下次启动时会在暂停的位置继续往下执行 每次启动都会返回一个值,多次启动可以返回多个值,也就是yield可以返回多个值 def ...

SORYUSHIKINAMI的博客 364

python中yield,greenlet,gevent实现协程

一.什么是协程: 协程是python中另外一种实现多任务的方式,只不过比线程更小,占用的执行资源(理解为需要的资源)也更少。为啥说他说一个执行单元?因为他自带cpu上下文,这样,在合适的额gr时机,我们就可以把一个协程切换到另一个协程。只要这个过程中保存或恢复了cpu上下文,那么程序就还是可以运行的。 二.协程与线程的差异: 在实现多任务时,线程的切换远不止系统层面上的保存和恢复cpu上下文那么简单。操作系统为了程序运行的高效性,每个线程都有自己的缓存cache等数据,......

qq_40132294的博客 748

腾讯音乐2023秋招系统测试岗笔试题复盘:基础与应用能力并重

系统测试岗位的笔试往往不直接考死记硬背的知识点,而是考察对操作系统、计算机网络、数据库等底层知识的理解,以及在具体业务场景中设计测试用例、定位问题根源的能力。对于备战大厂测试岗笔试的工程师来说,掌握TCP状态迁移、事务隔离级别、索引失效场景、Linux日志分析这类底层原理,远比单纯背诵概念更有价值。熟悉常见的测试用例设计方法,理解场景设计题的拆解思路,同样是通过笔试的关键。本文以腾讯音乐2023年秋招系统测试岗笔试题为例,复盘考察重点、答题策略与常见失分点,帮助你更有针对性地备战测试工程师秋招。

weixin_33851177的博客 319

python 协程原理_Python协程greenlet实现原理

greenlet是stacklessPython中剥离出来的一个项目,可以作为官方CPython的一个扩展来使用,从而支持Python协程。gevent正是基于greenlet实现。协程实现原理实现协程主要是在协程切换时,将协程当前的执行上下文保存到协程关联的context中。在c/c++这种native程序中实现协程,需要将栈内容和CPU各个寄存器的内容保存起来。在Python这种VM中则有些不...

weixin_39675178的博客 241

python基础——greenlet实现协程

greenlet实现协程 """ # 进程 》 线程 》 协程 协程:微线程 greenlet 完成协程任务:底层是使用生成器来实现,但是不够智能,需要手动去切换 """ import time import greenlet def a(): # 任务A for i in range(5): print('A', i) gb.switch() # 切换到任务b来执行 time.sleep(0.1) def b(): # 任务B f

weixin_42789698的博客 279

Python之携程(协程、yield 实现协程、yield from、greenlet实现协程、异步编程、线程与进程,协程对比、简单总结)

协程 协程介绍 协程,又称为微线程,它是实现多任务的另一种方式,只不过是比线程更小的执行单元。因为它自带CPU的上下文,这样只要在合适的时机,我们就可以把一个协程切换到另一个协程。 CPU上下文(CPU寄存器和程序计数器): 协程与线程差异 CPU寄存器是CPU的内置的容量小,但速度极快的内存。 程序计数器则是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。 yield 实现协程 yield实现协程 import time def task1(): while True:

yanghao8866的博客 2145

python协程实现--yield,yield from,greenlet,gevent

之前有讲过协程,协程就是在一个线程里面实现并发。注意和return区分开就好理解了 通俗的讲,协程在yield之后会保存当前代码的运行状态,切换到send处 专业的讲:协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程能够实现异步IO 协程评价 优点:

HWQlet的博客 428
上一篇: 利用协程爬取某网站
下一篇: scrapy如何GET和POST请求
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值