龙卷风上的皮卡消费者跑不动了

问题描述 投票:0回答:1

我想使用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

请帮我

python-2.7 rabbitmq tornado producer-consumer pika
1个回答
0
投票

在你的 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 实际上是一个警告,而且它是无害的(浏览器正在请求显示网络应用的图标,但如果没有可用的图标也不会抱怨)。

你也可能会遇到线程问题,因为Tornado和Pika运行在不同的线程中,所以你必须同步它们;你可以使用Tornado的 IOLoop.add_callback 的方法。

© www.soinside.com 2019 - 2024. All rights reserved.