我只是为了练习而实现greenlet API。
from greenlet import greenlet
def test1():
print 12
gr2.switch()
print 34
def test2():
print 56
gr1.switch()
print 78
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
这是我的混乱代码
def test1():
tmp1=yield
print 12
try:
gv2.send(1)
except StopIteration:
pass
tmp1=yield
print 34
def test2():
tmp2=yield
print 56
try:
gv2.send(1)
except StopIteration:
pass
tmp1=yield
print 78
gv1=test1()
gv1.next()
gv2=test2()
gv2.next()
gv1.send(1)
显示,
12
56
Traceback (most recent call last):
File "prog.py", line 26, in <module>
gv1.send(1)
File "prog.py", line 5, in test1
gv2.send(1)
File "prog.py", line 15, in test2
gv2.send(1)
ValueError: generator already executing
我不确定是否正确,但看起来在test1向test2发送'1'后,它仍然有一些东西,
不像gevent那样进行控制流切换。 test1仍具有该流程。
如果不是这样,那么我不明白greenlet可以做什么,而python的"协程"无法存在。
我的问题是:
- Python协程(基于yield)是真实的事情吗?(与其他语言如lisp、ruby等相比)
- 如果是,请给出一些那个spaghetti代码的提示?