python协程入门(greenlet)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

基本上greenlet的大体的东西都看的差不多了,看代码好久没有这么费劲过了,可能是有段时间没有看代码,或者这方面自己积累比较弱一些。。。

对于服务器端的编程,从多进程,到多线程,再到异步回调,再到现在比较流行的协程的方式。。。

个人觉得从异步回调到协程应该算是一种进步,通过提供一种同步的编程范式,但是实际却是异步的执行,这样既可以让程序员能够同步的方式写代码,又能够有异步的性能。。。

最开始接触到协程应该是从Lua语言上面看到的,不过当时自己并没有深入的去了解过,只是觉得这东西蛮不错的,最近自己在看gevent的东西,因为它是基于greenlet来实现的,所以就一并把greenlet的实现原理也看了下。。。


这篇文章就先来看看greenlet的基本使用吧,先来看如下代码:

from greenlet import greenlet

def test1():
	print "test1-1"
	gr2 = greenlet(test2)
	value = gr2.switch()
	print value


	
def test2():
	print "test2-1"
	return "fjsfjsfjs"



gr1 = greenlet(test1)


gr1.switch()

其执行结果如下图:


这里先是创建了一个greenlet,名字叫gr1,然后调用switch方法,让这个协程开始执行,

然后就开始test1的执行, 打印出了test1-1,接着在这里创建了另外一个greenlet,名字叫gr2,然后调用它的switch方法,开始运行,然后打印出了test2-1,接着返回了fjsfjsfjs,然后从输出结果可以看出接下来执行进入了test1,打印出了test2的返回结果。。。

这个样子看起来其实这里与同步的执行没啥区别,也看不出来有啥栈的切换。。。


那么将代码改成这个样子,然后就可以看出来有啥不一样了:

from greenlet import greenlet

def test1():
	print "test1-1"
	gr2.switch()
	print "test1-2"


	
def test2():
	print "test2-1"
	return "fjsfjsfjs"



gr1 = greenlet(test1)
gr2 = greenlet(test2)


out = gr1.switch()
print out

这段代码的输出结果如下:



这里可以看到,协程gr2执行的test2,将参数返回到了最外层,而没有将其在test1中返回,而且可以看到test1的最后那个输出并没有打印出来程序就已经结束了,也就是gr2执行完了之后,代码的执行并没有在test1返回,而是直接在最外层开始继续运行。。。而且返回结果也是直接到了最外层,而不是在test1中。。。


这个是为什么呢。。?这个就的说说greenlet的层次关系了。。。。。

在greenlet模块的初始话的时候,就会先建立一个最顶层的greenlet对象。。他属于greenlet层次关系中的root节点。。。接下来在创建greenlet的时候,如果在构造函数中并没有指明parent对象,那么构建出来的greenlet对象将会默认将当前环境所在的greenlet作为parent,当这个greenlet对象执行完成之后,将会调度其parent继续执行,而且会将返回参数也传递过去。。。


而在上述代码中,gr1,和gr2他们两个的parent都默认设置为了初始化建立的greenlet对象,所以在gr2执行完之后,并没有返回到gr1的test1函数中,而是直接返回到了最外层。。。


其实感觉greenlet基本的东西也就差不多了,本身内容就不是很多。。

这里可能还有一个参数传递的问题吧,如下代码:

from greenlet import greenlet

def test1(name):
	print name


	
gr1 = greenlet(test1)
gr1.switch("fjsfjs")

输出结果如下:



好了,这里的内容就不细说了,下一篇文章来介绍一下greenlet的实现原理。。。。

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

相关推荐

2024年最全专题15 python中的协程库—greenlet和gevent

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

2401_84558870的博客 1158

使用Python中的greenlet包实现并发编程的入门教程

主要介绍了使用Python中的greenlet包实现并发编程的入门教程,Python由于GIL的存在并不能实现真正的多线程并发,greenlet可以做到一个相对的替换方案,需要的朋友可以参考下

Python协程讲解

上篇文章我们说过由于GIL锁的限制,导致Python不能充分利用多线程来实现高并发,在某些情况下使用多线程可能比单线程效率更低,所以Python中出现了协程协程(coroutine)又称微线程,是一中轻量级的线程,它可以在函数的特定位置暂停或恢复,同时调用者可以从协程中获取状态或将状态传递给协程。进程和线程都是通过CPU的调度实现不同任务的有序执行,而协程是由用户程序自己控制调度的,也没有线程切换的开销,所以执行效率极高。 生成器方式实现 早先的协程是使用生成器关键字yield来实现的,和生成器很相.

weixin_50097774的博客 3662

为什么安装不了python-为什么我不能安装greenlet(只是一个基本的python包)?

$ py setup.py install/usr/lib/python2.6/distutils/dist.py:266: UserWarning: Unknown distribution option: "repository"warnings.warn(msg)running installrunning bdist_eggrunning egg_infowritin...

weixin_39630466的博客 355

python包编程教程_Python中的greenlet包实现并发编程的入门教程

Python由于GIL的存在并不能实现真正的多线程并发,greenlet可以做到一个相对的替换方案1 动机greenlet 包是 Stackless 的副产品,其将微线程称为 “tasklet” 。tasklet运行在伪并发中,使用channel进行同步数据交换。一个”greenlet”,是一个更加原始的微线程的概念,但是没有调度,或者叫做协程。这在你需要控制你的代码时很有用。你可以自己构造微...

weixin_39624733的博客 222

Python零基础入门篇 · 36】:greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结

1、进程是资源分配的基本单位,线程是CPU调度的基本单位。2、对比进程:切换需要的资源较大,效率低线程:切换需要的资源一般,效率一般协程:切换需要的资源很小,效率高多线程适合IO密集型操作(读写数据操作多的,比如爬虫等)多进程适合CPU密集型操作(科学计算、对视频进行高清解码等)

Oh_Python的博客 995

Python协程-greenlet模块教程

Python协程-greenlet模块教程

Python热爱者的博客 975

greenlet 详解

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

weixin_34074740的博客 316

Python快速入门(十四)协程:迭代器、生成器、yield、greenlet、gevent

前言:主要讲解了迭代器、生成器、使用yield、greenlet、gevent来完成多任务。

等待着冬天的风的博客 377

Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结

一、协程 1、协程的理解 协程,又称微线程,纤程。英文名Coroutine。 协程python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。 通俗的理解: 在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到

Oh_Python的博客 982

Python异步学习笔记

协程 协程不是真是存在的,程序员人为创造出来的(上下文切换的技术) 协程:可以成为微线程,是一种用户态的上下文切换技术,简而言之,其实就是通过一个线程实现代码块相互切换执行。 def func1(): print(1) print(2) print(3) def fun2(): print(3) print(4) func1() func2() 实现协程 greenlet yield关键字 asyncio 装饰器 ...

I can do its的博客 248

【专题】python中的协程库—greenlet和gevent

Python协程greenlet 和 gevent

qq_36581961的博客 1065

Python 协程详解

什么是协程 Python协程的支持经历了多个版本: 一、协程实现方法: 1、greenlet,早期模块 2、yield关键字(Python2.x开始) 3、asyncio装饰器(Python 3.4开始) 4、async、await关键字(Python 3.5开始) 5、gevent 二、协程的运行原理 三、协程应用场景 1、抢占式调度的缺点 2、用户态协同调度的优势 四、协程使用注意事项...

c_lanxiaofang的博客 1万+

Python协程 Gevent Eventlet Greenlet

https://zh.wikipedia.org/zh-cn/%E5%8D%8F%E7%A8%8B 协程可以理解为线程中的微线程,通过手动挂起函数的执行状态,在合适的时机再次激活继续运行,而不需要上下文切换。所以在python中使用协程会比线程性能更好。 Tornado协程 http://blog.csdn.net/wyx819/article/details/45420017 ...

weixin_30716725的博客 1534

协程greenlet

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

一只程序猿 499

Python协程greenlet实现原理

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

qq_40954115的博客 279

专题15 python中的协程库—greenlet和gevent(1)

安装:pip3 install gevent。

2401_84140463的博客 660

python中的greenlet

1.greenlet定义: gevent中使用的主要模式是greenlet,它是一个轻量级协程,作为C扩展模块提供给python, greenlet都是在主程序的操作系统进程内部运行,但都是协同调度的 在任何给定的时间内,只有一个greenlet在运行 2.并发的概念: 并发是指两个或多个事件在同一时间间隔发生 并发性的核心思想是将...

u011089760的博客 2836

python3之协程(3)---greenlet实现协程操作

原文链接:https://www.cnblogs.com/xybaby/p/6337944.html   正文    在前面的文章中提到python原生的generator是semicoroutine,而greenlet是 真 协程。本文内容主要来自对官网文档的翻译,在其中也加入了很多自己的理解和例子。主要包括以下内容:什么是greenletgreenlet的切换与函数调用的区别,gree...

liujiayu2的专栏 1234
上一篇: 支持并发的http客户端(基于tcp连接池以及netty)
下一篇: python协程的实现(greenlet源码分析)
fjs_cloud
博客等级 码龄15年 248粉丝 192原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值