Python 协程的无限递归的问题
hi, 最近看了关于Python协程的相关文章协程的简单理解,说协程可以无限递归,于是想写一个协程示例练练,于是:
import time
def ping():
print 'ping 0'
count = 1
try:
pi,po = yield s
print 'ping ' + str(count)
count += 1
time.sleep(1)
po.send([po, pi])
except StopIteration:
pass
def pong():
print 'pong 0'
count = 1
try:
po, pi = yield s
print 'pong ' + str(count)
count += 1
time.sleep(1)
pi.send([pi,po])
except StopIteration:
pass
s = ping()
r = pong()
s.next()
r.next()
s.send([s,r])
运行结果是:
ping 0
pong 0
ping 1
pong 1
Traceback (most recent call last):
File "D:\test\coroutine.py", line 34, in <module>
s.send([s,r])
File "D:\test\coroutine.py", line 12, in ping
po.send([po, pi])
File "D:\test\coroutine.py", line 25, in pong
pi.send([pi,po])
ValueError: generator already executing
那篇文章使用了stackless,我想实现一个原始的方法。但是出错,不知道要实现无限递归的话,应该怎么写嘞?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你需要的是用一个 run 函数管理协程。
在 ping 和 pong 函数内,yield 返回 run。
在 run 函数内,用 next() 对协程进行调度。
运行结果:
========================================================
带消息传递版:
运行结果:
你写的确实是有问题,不过最主要的是,Stackless是一个修改版的Python,它的coroutine和标准CPython里的貌似不太一样,如果你想要在CPython里面实现类似的功能,可能需要基于greenlet来做。
http://anandology.com/blog/using-iterators-and-generators/
应该是把generator自身传递造成了问题,send自己导致的
要是pi po是全局变量应该不会有问题
生成器的用法明显错误,s 没有被 yield 挂起 , 你再去 send/next 当然会报这个错误
不知道你具体是要实现什么, 如果是要 “ping pong” 交替打印, 用一个generator 就行了