我正在研究Tornado中的一个项目,该项目严重依赖于库的异步功能。通过跟随chat demo,我已经设法使用我的应用程序进行长轮询,但是我似乎遇到了一切问题。
基本上我想做的是能够在UpdateManager
类上调用一个函数,让它完成对等待列表中任何回调的异步请求。这里有一些代码来解释我的意思:
update.py:
class UpdateManager(object):
waiters = []
attrs = []
other_attrs = []
def set_attr(self, attr):
self.attrs.append(attr)
def set_other_attr(self, attr):
self.other_attrs.append(attr)
def add_callback(self, cb):
self.waiters.append(cb)
def send(self):
for cb in self.waiters:
cb(self.attrs, self.other_attrs)
class LongPoll(tornado.web.RequestHandler, UpdateManager):
@tornado.web.asynchronous
def get(self):
self.add_callback(self.finish_request)
def finish_request(self, attrs, other_attrs):
# Render some JSON to give the client, etc...
class SetSomething(tornado.web.RequestHandler):
def post(self):
# Handle the stuff...
self.add_attr(some_attr)
(有更多代码实现了URL处理程序/服务器等,但我不相信这个问题是必要的)
所以我想要做的就是这样我可以从我的应用程序中的另一个地方调用UpdateManager.send,并且仍然将数据发送给等待的客户端。问题在于,当您尝试这样做时:
from update import UpdateManager
UpdateManager.send()
它只获取UpdateManager
类,而不是持有用户回调的实例。所以我的问题是:有没有办法用Tornado创建一个持久对象,这将允许我在整个应用程序中共享一个UpdateManager
的实例?
答案 0 :(得分:4)
不要使用实例方法 - 使用class methods(毕竟,你已经在使用类属性,你可能没有意识到)。这样,您不必实例化对象,而只需调用类本身的方法,该方法充当单例:
class UpdateManager(object):
waiters = []
attrs = []
other_attrs = []
@classmethod
def set_attr(cls, attr):
cls.attrs.append(attr)
@classmethod
def set_other_attr(cls, attr):
cls.other_attrs.append(attr)
@classmethod
def add_callback(cls, cb):
cls.waiters.append(cb)
@classmethod
def send(cls):
for cb in cls.waiters:
cb(cls.attrs, cls.other_attrs)
这将使......
from update import UpdateManager
UpdateManager.send()
按照你的意愿工作。