python2协程的应用yield,同步方式写异步代码

python协程基础知识可以先了解下之前的文章:
​​​​​​一篇文章了解Python中的协程、例子、协程的发展_巴山夜雨-CSDN博客_python 协程o

python3用asyncio很容易实现这种写法

python2的协程更加简单,要实现同步方式写异步代码,只要做些封装也可以实现

协程1Python 2 的yeild和send

    生成器yeild和send,实现协程的老方法,只能实现协程基本功能,保存状态、实现函数的能暂停、恢复等。

# coding: utf-8
 
def coroutine_work():
    print '->start work'
    
    while True:
        rc = (yield)
        print '->work', rc
 
def coroutine_eat():
    print '->start eat'
 
    while True:
        rc = (yield)
        print '->eat', rc
 
 
cw = coroutine_work()
ce = coroutine_eat()
next(cw)  # next启动work协程
next(ce)  # next启动eat协程
cw.send('1')
ce.send('1')
cw.send('2')
ce.send('2')
ce.close()
cw.close()

即带yield关键字的函数被调用时候,返回的是一个生成器对象(generator object),函数的状态帧都保存了下来,执行send方法时在继续执行

跟据这个特性,即可以以同步的方式,些异步的代码

比如一个登录方法,验证密码需要异步去请去查询密码是否正确(如http)

可以这样这样些,

# 同步方式写异步代码,类似asyncio
def user_login(user, pw):
    if user.is_valid():
        # 角色能登录
        http.request(url, user_id, pw, yid):
        result = yield
        if result is True:
            print("登录成功")
        else:
            print("秘密错误,登录失败")
    else:
        print("登录失败")
yield_call(user_login)

 

主要做法就是,等http返回时候,通过yid去肇东对应的生成器对象,再去调用

参考封装代码:


g_yid2obj = {}
g_cur_add_yid = 0


class YieldObjectWarp(object):
	def __init__(self, parent_id, func, *args, **kwargs):
		global g_cur_add_yid
		g_cur_add_yid += 1
		self.m_yield_obj = func(g_cur_add_yid, *args, **kwargs)
		g_yid2obj[g_cur_add_yid] = self
		self.m_ParentID = parent_id
		self.send(None)

	def send(self, value):
		try:
			ret = self.m_yield_obj.send(value)
			state, result = ret if ret else (False, None)
			if state and self.m_ParentID:
				g_yid2obj[self.m_ParentID].send((state, result))
		except:
			state, result = False, None
			g_yid2obj.pop(id(self), None)
			if self.m_ParentID:
				g_yid2obj[self.m_ParentID].send((state, result))
		return state, result

	def close(self):
		return self.m_yield_obj.close()


def yield_call(func, *args, **kwargs):
	yobj = YieldObjectWarp(None, func, *args, **kwargs)
	return yobj

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值