我试图理解并检查龙卷风如何执行协同程序。 我注意到一种行为让我觉得gen.coroutine不起作用。
看下面的测试。它通过,我希望得到l = [“S1”,“BF”,“S2”,“S3”],因为当子域产生asyncSubMain时它返回到事件循环队列以拉下一个回调它应该得到“beforeYield”,因为它原计划提前。
def test_call_coroutine_function(ioLoop):
l = []
def syncSubMain():
return "Oh! at last I understood how tornado turns"
@gen.coroutine
def asyncSubMain():
l.append("S2")
return syncSubMain()
def beforeYield():
l.append("BF")
@gen.coroutine
def submain():
l.append("S1")
ioLoop.add_callback(beforeYield)
y = yield asyncSubMain()
l.append("S3")
raise gen.Return(y)
@gen.coroutine
def main():
x = yield submain()
raise gen.Return(x)
assert ioLoop.run_sync(main).startswith("Oh!")
assert l == ["S1", "S2", "S3", "BF"]
以下测试表现得像我想要的那样,我没有使用@ gen.coroutine。
def test_sync_all_async(ioLoop):
class C:
f = 0
l = []
def mf(self):
return 1
# gen.coroutine is not needed and if just call a method
# with gen_coroutine it's executed synchronously
def m3(self, a):
self.l.append(a)
self.f = self.mf()
def m2(self):
self.l.append("A")
ioLoop.add_callback(self.m3, "B")
self.l.append("C")
def m(self):
self.m2()
c = C()
ioLoop.run_sync(c.m)
assert c.f == 1
assert c.l == ["A", "C", "B"]
我认为@ gen.coroutine只是上面测试的语法糖。 在这些测试中,要么它不起作用,要么与具有回调的事件循环不同。