Socket实现在接收到不同的消息时启动 PeriodicCallback 返回不同的数据,并且关闭时只关闭其中某一个定时器
首先,你需要对 MainHandler 进行修改,添加一个字典 callbacks,用于保存每个消息对应的回调函数和其它相关信息,例如:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
callbacks = {}
def on_message(self, message):
if message == "start_1":
self.start_callback(1)
elif message == "start_2":
self.start_callback(2)
elif message == "stop_1":
self.stop_callback(1)
elif message == "stop_2":
self.stop_callback(2)
else:
self.write_message("Unknown command")
def start_callback(self, callback_id):
if callback_id not in self.callbacks:
pc = tornado.ioloop.PeriodicCallback(lambda: self.write_message(f"Callback {callback_id}: some data"), 1000)
pc.start()
self.callbacks[callback_id] = {"callback": pc, "data": None}
self.write_message(f"Callback {callback_id} started")
else:
self.write_message(f"Callback {callback_id} already started")
def stop_callback(self, callback_id):
if callback_id in self.callbacks:
self.callbacks[callback_id]["callback"].stop()
self.write_message(f"Callback {callback_id} stopped")
del self.callbacks[callback_id]
else:
self.write_message(f"Callback {callback_id} not started")
app = tornado.web.Application([(r"/", MainHandler)])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在上面的代码中,我们添加了一个 callbacks 字典,用于保存每个消息对应的回调函数和其它相关信息。在 on_message 方法中,当接收到消息 "start_1" 或 "start_2" 时,调用 self.start_callback 方法启动对应的定时器,并将定时器和其它相关信息保存到 callbacks 字典中。在 start_callback 方法中,如果 callbacks 字典中没有对应的回调函数,则创建一个新的 PeriodicCallback 对象,并将其启动;否则,直接返回已经启动的定时器。在定时器执行的回调函数中,我们通过 self.write_message 方法返回对应的数据。当接收到消息 "stop_1" 或 "stop_2" 时,调用 self.stop_callback 方法停止对应的定时器,并从 callbacks 字典中删除对应的信息。在 stop_callback 方法中,如果 callbacks 字典中存在对应的回调函数,则调用其 stop 方法停止定时器,并从字典中删除对应的信息;否则,直接返回对应的错误信息。
需要注意的是,在上面的代码中,我们使用了 lambda 表达式来创建定时器的回调函数,这样可以在回调函数中访问到 callback_id 参数,从而实现根据不同的消息返回不同
标签:socket,callbacks,self,stop,callback,message,id,服务端 From: https://www.cnblogs.com/DTCLOUD/p/17382386.html作者:燕春