鼠兔消费者的龙卷风不能运行
Tornado on pika consumer can't run
我想用RabbitMQ和Tornado搭建监控系统。我可以 运行 生产者和我的消费者可以使用队列中的数据,但数据无法在网站上显示。
这只是我在使用传感器之前的实验
import pika
import tornado.ioloop
import tornado.web
import tornado.websocket
import logging
from threading import Thread
logging.basicConfig(lvl=logging.INFO)
clients=[]
credentials = pika.credentials.PlainCredentials('ayub','ayub')
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.43.101',
5672,
'/',
credentials))
channel = connection.channel()
def threaded_rmq():
channel.basic_consume('Queue',
on_message_callback= consumer_callback,
auto_ack=True,
exclusive=False,
consumer_tag=None,
arguments=None)
channel.start_consuming()
def disconect_rmq():
channel.stop_consuming()
Connection.close()
logging.info('Disconnected from broker')
def consumer_callback(ch,method,properties,body):
for itm in clients:
itm.write_message(body)
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
logging.info('websocket open')
clients.remove(self)
def close(self):
logging.info('websocket closed')
clients.remove(self)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("websocket.html")
application = tornado.web.Application([
(r'/ws',SocketHandler),
(r"/", MainHandler),
])
def startTornado():
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
def stopTornado():
tornado.ioloop.IOLoop.instance().stop()
if __name__ == "__main__":
logging.info('starting thread RMQ')
threadRMQ = Thread(target=threaded_rmq)
threadRMQ.start()
logging.info('starting thread tornado')
threadTornado = Thread(target=startTornado)
threadTornado.start()
try:
raw_input("server ready")
except SyntaxError:
pass
try:
logging.info('disconnected')
disconnect_rmq()
except Exception, e:
pass
stopTornado()
但我遇到了这个错误
WARNING:tornado.access:404 GET /favicon.ico (192.168.43.10) 0.98ms
请帮帮我
在您的 SocketHandler.open
函数中,您需要添加客户端而不是删除它。
还可以考虑为客户端使用 set
而不是 list
,因为删除操作会更快:
clients = set()
...
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
logging.info('websocket open')
clients.add(self)
def close(self):
logging.info('websocket closed')
clients.remove(self)
您收到的有关 favicon.ico
的消息实际上是一个警告,它是无害的(浏览器正在请求为 Web 应用程序显示一个图标,但如果 none 可用则不会抱怨)。
您可能还会 运行 遇到线程问题,因为 Tornado 和 Pika 运行 处于不同的线程中,因此您必须同步它们;你可以使用 Tornado 的 IOLoop.add_callback
方法。
我想用RabbitMQ和Tornado搭建监控系统。我可以 运行 生产者和我的消费者可以使用队列中的数据,但数据无法在网站上显示。
这只是我在使用传感器之前的实验
import pika
import tornado.ioloop
import tornado.web
import tornado.websocket
import logging
from threading import Thread
logging.basicConfig(lvl=logging.INFO)
clients=[]
credentials = pika.credentials.PlainCredentials('ayub','ayub')
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.43.101',
5672,
'/',
credentials))
channel = connection.channel()
def threaded_rmq():
channel.basic_consume('Queue',
on_message_callback= consumer_callback,
auto_ack=True,
exclusive=False,
consumer_tag=None,
arguments=None)
channel.start_consuming()
def disconect_rmq():
channel.stop_consuming()
Connection.close()
logging.info('Disconnected from broker')
def consumer_callback(ch,method,properties,body):
for itm in clients:
itm.write_message(body)
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
logging.info('websocket open')
clients.remove(self)
def close(self):
logging.info('websocket closed')
clients.remove(self)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("websocket.html")
application = tornado.web.Application([
(r'/ws',SocketHandler),
(r"/", MainHandler),
])
def startTornado():
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
def stopTornado():
tornado.ioloop.IOLoop.instance().stop()
if __name__ == "__main__":
logging.info('starting thread RMQ')
threadRMQ = Thread(target=threaded_rmq)
threadRMQ.start()
logging.info('starting thread tornado')
threadTornado = Thread(target=startTornado)
threadTornado.start()
try:
raw_input("server ready")
except SyntaxError:
pass
try:
logging.info('disconnected')
disconnect_rmq()
except Exception, e:
pass
stopTornado()
但我遇到了这个错误
WARNING:tornado.access:404 GET /favicon.ico (192.168.43.10) 0.98ms
请帮帮我
在您的 SocketHandler.open
函数中,您需要添加客户端而不是删除它。
还可以考虑为客户端使用 set
而不是 list
,因为删除操作会更快:
clients = set()
...
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
logging.info('websocket open')
clients.add(self)
def close(self):
logging.info('websocket closed')
clients.remove(self)
您收到的有关 favicon.ico
的消息实际上是一个警告,它是无害的(浏览器正在请求为 Web 应用程序显示一个图标,但如果 none 可用则不会抱怨)。
您可能还会 运行 遇到线程问题,因为 Tornado 和 Pika 运行 处于不同的线程中,因此您必须同步它们;你可以使用 Tornado 的 IOLoop.add_callback
方法。