当前位置: 首页 > 面试题库 >

如何在python中的websocket循环外运行函数(tornado)

梁楷
2023-03-14
问题内容

我正在尝试通过websocket建立一个Twitter公开流的小例子。这是我的websocket.py,正在运行。

我想知道的是:如何从WSHandler类外部与websocket交互(即,不仅从websocket.js接收消息时回答)?假设我想在此脚本中运行其他函数,该函数将发布“
hello!”。每五秒钟将其发送到websocket(浏览器),而无需客户端进行任何交互。我该怎么办?

因此,我想这是一个基本的初学者问题,关于如何处理以下类。任何方向的指针将不胜感激!

import os.path
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

# websocket
class FaviconHandler(tornado.web.RequestHandler):
    def get(self):
        self.redirect('/static/favicon.ico')

class WebHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("websockets.html")

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("Hi, client: connection is made ...")

    def on_message(self, message):
        print 'message received: \"%s\"' % message
        self.write_message("Echo: \"" + message + "\"")
        if (message == "green"):
            self.write_message("green!")

    def on_close(self):
        print 'connection closed'



handlers = [
    (r"/favicon.ico", FaviconHandler),
    (r'/static/(.*)', tornado.web.StaticFileHandler, {'path': 'static'}),
    (r'/', WebHandler),
    (r'/ws', WSHandler),
]

settings = dict(
    template_path=os.path.join(os.path.dirname(__file__), "static"),
)

application = tornado.web.Application(handlers, **settings)

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

问题答案:

你可以打电话给

IOLoop.add_timeout(deadline, callback)

在指定的最后期限超时(一次射击,但您可以重新安排)时调用回调,或使用

tornado.ioloop.PeriodicCallback 如果您有更定期的任务。

请参阅:http
:
//www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop.add_timeout

更新:一些例子

import datetime

def test():
    print "scheduled event fired"
...

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    main_loop = tornado.ioloop.IOLoop.instance()
    # Schedule event (5 seconds from now)
    main_loop.add_timeout(datetime.timedelta(seconds=5), test)
    # Start main loop
    main_loop.start()

test()在5秒钟后呼叫。

更新2:

import os.path
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

# websocket
class FaviconHandler(tornado.web.RequestHandler):
    def get(self):
        self.redirect('/static/favicon.ico')

class WebHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("websockets.html")

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("Hi, client: connection is made ...")
        tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=5), self.test)

    def on_message(self, message):
        print 'message received: \"%s\"' % message
        self.write_message("Echo: \"" + message + "\"")
        if (message == "green"):
            self.write_message("green!")

    def on_close(self):
        print 'connection closed'

    def test(self):
        self.write_message("scheduled!")

handlers = [
    (r"/favicon.ico", FaviconHandler),
    (r'/static/(.*)', tornado.web.StaticFileHandler, {'path': 'static'}),
    (r'/', WebHandler),
    (r'/ws', WSHandler),
]

settings = dict(
    template_path=os.path.join(os.path.dirname(__file__), "static"),
)

application = tornado.web.Application(handlers, **settings)

import datetime

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()


 类似资料:
  • 我想用函数循环我的代码,但我不知道怎么做。我想循环直到用户说停止。我的输出也有问题,当调用函数。我对C++还是个新手。感谢任何帮助! 我计划我的输出是这样的:欢迎来到和谐礼品店-(用户名) 您已购买:(说明1)类别:(说明2)您应支付:(总价) 代码:

  • 问题内容: 我有一个while循环,我希望它能持续运行15分钟。目前是: (这会运行,然后重新启动。我需要它继续执行此操作,除非15分钟后退出循环) 谢谢! 问题答案: 尝试这个: 这将运行15分钟x 60 s = 900秒。 函数以1970年1月1日为单位返回当前时间(以秒为单位)。该值以浮点数表示,因此您甚至可以使用亚秒精度。在开始时,值t_end计算为“现在” + 15分钟。循环将一直运行,

  • 问题内容: 如果我在一个循环中有一个循环,并且一旦满足一条语句,我想中断主循环,那我应该怎么做? 这是我的代码: 问题答案: 使用标记的中断: 另请参阅 Java代码中的“循环:”。 这是什么,为什么会编译? 文献资料

  • 问题内容: 在以下python代码中: 我得到: 为什么? 问题答案: 因为break不能用于中断if-它只能中断循环。这就是指定Python(和大多数其他语言)运行的方式。 你想做什么?也许您应该使用还是代替?

  • 问题内容: 我先研究了一下,却找不到答案。我试图在Python中并行运行多个函数。 我有这样的事情: 我想调用func1和func2并使它们同时运行。这些功能彼此之间或在同一对象上不相互作用。现在,我必须等待func1完成才能启动func2。我该如何执行以下操作: 我希望能够几乎同时创建两个目录,因为我每分钟都在统计要创建多少个文件。如果该目录不存在,将会拖延我的时间。 问题答案: 你可以使用th

  • 我想在一个并行外部循环中运行一个包含for循环(应该并行运行)的函数。因此看起来如下所示: 给定上面的代码,我希望在函数中为循环创建5个并行线程,并且希望这5个线程中的每个线程创建另一个线程来运行自己的并行for循环。