socket服务端

lxf2023-05-09 00:45:24

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

作者:燕春

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!