我正在尝试通过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循环。