我正在实施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()
Run Code Online (Sandbox Code Playgroud)
这是我凌乱的代码
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)
Run Code Online (Sandbox Code Playgroud)
可见,
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
Run Code Online (Sandbox Code Playgroud)
所以,我不知道我猜对了,
但看起来在test1发送'1'到test2后,它仍然有一些东西,
与gevent不同,没有控制流切换发生.test1仍有流量.
如果没有,我不明白greenlet可以做什么,但python"coroutine"不能存在.
我的问题是
生成器实例test2()正在向自身发送值.
def test2():
tmp2=yield
print 56
try:
gv2.send(1) # this is the offending line
except StopIteration:
pass
tmp1=yield
print 78
Run Code Online (Sandbox Code Playgroud)
send()将恢复生成器,但无论何时在内部执行代码test2(),它都已经在运行.这就是它抛出的原因.
你想做什么的gv1.send(1)?这也行不通.
原因如下:
gv1.send(1)你的例子结束
之前gv1.send(1) 被调用,这个恢复 gv1gv1 继续前进 gv2.send(1)gv2gv2 继续前进 gv1.send(1)gv1正在恢复,但是,gv1还没有达到yield,因为它是最后恢复的语句.因此,它仍在运行,这就是为什么它也会抛出.从本质上讲,差异可以总结如下:
.switch()暂停当前正在执行的greenlet然后将恢复.yield 将"暂停"一台发电机next()/ send()将恢复暂停的生成器,在运行的生成器上调用它们将导致异常.你为什么要访问gv2(代表一个特定的实例test2)?发电机test2()应该是独立的,不要对它的使用方式做任何假设.如果您决定要从其他范围调用生成器,该怎么办?无论如何向自己发送价值是没有任何意义的:你已经拥有它们.
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |