練習用に 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 が「1」を test2 に送信した後、まだ何かが残っているようです。
gevent とは異なり、制御フローの切り替えは発生しません。test1 にはまだフローがあります。
そうでない場合、greenlet で何ができるかわかりませんが、python の「コルーチン」は存在しません。
私の質問は
- pythonコルーチン(yield-based)は本物です(他と比べてみると…lisp,ruby,&c)
- 正しければ、そのスパゲッティ コードのヒントを教えてください。