龙卷风执行令

时间:2016-04-14 06:24:29

标签: python tornado coroutine

我试图理解并检查龙卷风如何执行协同程序。 我注意到一种行为让我觉得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只是上面测试的语法糖。 在这些测试中,要么它不起作用,要么与具有回调的事件循环不同。

0 个答案:

没有答案