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提供未来的用例。