Python 订阅龙卷风中的事件

Python 订阅龙卷风中的事件,python,asynchronous,web,callback,tornado,Python,Asynchronous,Web,Callback,Tornado,我的事件意识有什么问题 class MyHandler(RequestHandler): counter = 0 @coroutine def post(self): yield self.foo() self.write("Next 5 request!!!") @coroutine def foo(self): if MyHandler.counter == 0: MyHand

我的事件意识有什么问题

class MyHandler(RequestHandler):
    counter = 0
    @coroutine
    def post(self):
        yield self.foo()
        self.write("Next 5 request!!!")

    @coroutine
    def foo(self):

        if MyHandler.counter == 0:
            MyHandler.callback = yield tornado.gen.Callback("MyEvent")

        MyHandler.counter += 1
        if MyHandler.counter == 5:
            MyHandler.callback()
            MyHandler.counter = 0
        else:
            tornado.gen.Wait("MyEvent")
我一直有:

raise UnknownKeyError("key %r is not pending" % (key,))
UnknownKeyError: key 'MyEvent' is not pending
我还在tornado文档中找到了回调并等待:

Deprecated since version 4.0: Use Futures instead.
但在我的情况下,没有任何地方能找到未来的用途。
请提供帮助。

问题是,您收到的每个请求都会创建一个新的
MyHandler
实例,因此您的
计数器和
回调变量不会在请求之间共享。您确实希望它们是类变量,以便在实例之间共享

以下是如何在Futures中实现它:

class MyHandler(tornado.web.RequestHandler):
    fut = None
    counter = 0
    @coroutine
    def get(self):
        yield self.foo()
        self.write("Next 5 request!!!")

    @coroutine
    def foo(self):
        if MyHandler.counter == 0:
            MyHandler.fut = Future()

        MyHandler.counter += 1
        if MyHandler.counter == 5:
            MyHandler.counter = 0
            MyHandler.fut.set_result("done") # This will wake up waiting requests.
        else:
            yield MyHandler.fut

我很高兴,但我在示例代码中犯了一个错误。我存储在应用程序上的计数器和回调:self.application.Counter。我检查了-这部分没有问题。在你的Future示例中,我有下一个问题。在第一次接触yield MyHandler.fut时,ioloop已锁定,在发送请求端,我收到前4个请求的599 http错误。@SymonSoft您还记得
@coroutine
装饰器吗?我无法重现您在我的系统上看到的问题。是的。handler的post和foo()上的两个decorator。我发现了带有循环锁的bug。感谢@dano提供未来的用例。