Торнадо на пике потребитель не может бежать - PullRequest
0 голосов
/ 03 мая 2020

Я хочу построить систему мониторинга, используя 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

пожалуйста, помогите мне

1 Ответ

0 голосов
/ 03 мая 2020

В вашей функции 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 работают в разных потоках, поэтому вам придется их синхронизировать; для этого вы можете использовать IOLoop.add_callback метод Торнадо.

...