鼠兔消费者的龙卷风不能运行

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 方法。