socket服务端

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 参数,从而实现根据不同的消息返回不同

作者:燕春

猜你喜欢

转载自blog.csdn.net/ekcchina/article/details/130562902