基于python生成器封装的协程类
作者:OshynSong 发布时间:2022-09-25 04:57:53
标签:python,生成器,协程类
自从python2.2提供了yield关键字之后,python的生成器的很大一部分用途就是可以用来构建协同程序,能够将函数挂起返回中间值并能从上次离开的地方继续执行。python2.5的时候,这种生成器更加接近完全的协程,因为提供了将值和异常传递回到一个继续执行的函数中,当等待生成器的时候,生成器能返回控制。
python提供的生成器设施:
yield:能够将自己挂起,并提供一个返回值给等待方
send:唤起一个被挂起的生成器,并能够传递一个参数,可以在生成器中抛出异常
next:本质上相当于send(None),对每个生成器的第一次调用必须不能传递参数
close:主动退出一个生成器
python封装
虽然python3提供了asyncio这样的异步IO库,而且也有greenlet等其他协程库,但目前的需求并不是实际的网络IO并发操作,而是需要模拟状态机的运行,因此使用协程可以很方便的模拟,并加入认为的控制,下面是封装的一个python类。
class Coroutine(object):
""" Base class of the general coroutine object """
STATE_RUNNING = 0
STATE_WAITING = 1
STATE_CLOSING = 2
def __init__(self):
self.state = Coroutine.STATE_WAITING
self.started = False
self.args = None
self.routine = self._co()
def _co(self):
self.ret = None
while True:
self.args = yield self.ret
if not self.started:
self.started = True
continue
else:
self.state = Coroutine.STATE_RUNNING
self.ret = self.run(self.args)
if self.state == Coroutine.STATE_CLOSING:
break
self.state = Coroutine.STATE_WAITING
def start(self):
""" Start the generator """
if self.routine is None:
raise RuntimeError('NO task to start running!')
self.started = True
self.routine.next()
def finish(self):
""" Finish the execution of this routine """
self.state = Coroutine.STATE_CLOSING
self.routine.close()
def run(self, args):
""" The runing method to be executed every once time"""
raise NotImplementedError
def execute(self, arg_obj):
""" Awake this routine to execute once time """
return self.routine.send(arg_obj)
基于上述封装,下面实现了一个协同的生产者消费者示例:
class ProducerCoroutine(Coroutine):
""" The Producer concrete coroutine """
def __init__(self, cnsmr):
if not isinstance(cnsmr, Coroutine):
raise RuntimeError('Consumer is not a Coroutine object')
self.consumer = cnsmr
self.consumer.start()
super(ProducerCoroutine, self).__init__()
def run(self, args):
print 'produce ', args
ret = self.consumer.execute(args)
print 'consumer return:', ret
def __call__(self, args):
""" Custom method for the specific logic """
self.start()
while len(args) > 0:
p = args.pop()
self.execute(p)
self.finish()
class ConsumerCoroutine(Coroutine):
""" The Consumer concrete coroutine """
def __init__(self):
super(ConsumerCoroutine, self).__init__()
def run(self, args):
print 'consumer get args: ', args
return 'hahaha' + repr(args)
运行结果如下:
produce 4
consumer get args: 4
consumer return: hahaha4
produce 3
consumer get args: 3
consumer return: hahaha3
produce 2
consumer get args: 2
consumer return: hahaha2
produce 1
consumer get args: 1
consumer return: hahaha1
produce 0
consumer get args: 0
consumer return: hahaha0
来源:https://blog.csdn.net/u010487568/article/details/62042709


猜你喜欢
- 前两天,编辑建议我去当当和卓越申请个用户,在网站上放上我的书的链接,这样还可以拿到一些反点儿,于是我兴冲冲地跑到几个网站上去看,却只在卓越(
- 密码保护是注册过程中的关键环节,尤其是对帐户安全级别比较高的网站,尤其在账号被盗或者涉及安全登录等问题的情况下,密码保护问题作为用户身份识别
- 什么是ODBCODBC是open database connect的缩写,意思是开放式数据库连接利用ODBC进行数据库连接首先要下载数据库!
- IE8 的测试版发布,ACID 3 测试正式推出,听上去是让人兴奋的技术进步,而对中文互联网站却是极大的威胁:这意味着,超过半数的中文网页在
- 1. JWT 介绍jwt( JSON Web Tokens ),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明。目前
- 1. 什么是文件指纹?文件指纹就是打包后输出的文件名的后缀,主要用来对修改后的文件做版本区分。2. 文件指纹有哪几种?1. Has
- 前言验证码的种类有很多,它是常用的一种反爬手段,包括:图片验证码,滑块验证码,等一些常见的验证码场景。识别验证码的python 库有很多,用
- 1、Python的min函数返回列表中的最小的项。2、如何返回列表中最小的项的索引?def indexofMin(arr):
- 整理自慕课笔记基础表单表单主要功能是用来与用户做交流的一个网页控件,良好的表单设计能够让网页与用户更好的沟通。表单中常见的元素主要包括:文本
- 最近开发过程中遇到一些小问题(似乎问题总是那么多),但一直没什么时间去优化与解决。程序员不能被业务绑架,有时间还是花点在代码,开始这次的vu
- ● 脚本用途遍历文件夹下的文件,消除文件名前的特征字符串。● 脚本实现import os,sysimport refrom string i
- 本书状态你正在阅读的已经是本书的最终版。因此,只有当进行错误更正以及针对新版本Node.js的改动进行对应的修正时,才会进行更新。本书中的代
- 项目中遇到图片实际显示尺寸的判定问题,图片可能被缩放过,所以实际显示的宽高无法通过常见的各种width,height拿到(都是得到图像的自然
- 原理希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C
- Ubuntu16.04自带python2.7与python3.5,某个项目编译却要求python版本大于等于3.7,遂考虑在原系统基础上再安
- 直接贴代码啦:#coding=utf-8import pandas as pddef arff_to_csv(fpath): #
- 前言在pytorch中经常会遇到图像格式的转化,例如将PIL库读取出来的图片转化为Tensor,亦或者将Tensor转化为numpy格式的图
- 本文实例讲述了python清除指定目录内所有文件中script的方法。分享给大家供大家参考。具体如下:将脚本存储为stripscripts.
- 本文实例为大家分享了python编写决策树源代码,供大家参考,具体内容如下因为最近实习的需要,所以用python里的sklearn包重新写了
- 本文根据自己初学经验编写的使用xlwt模块设置单元格的一些基本样式,如设置单元格的背景颜色,下框线,字体,字体的颜色,设置列宽行高,插入简单