如何从外部调用tornado.queues消息

时间:2017-10-20 10:51:22

标签: python tornado

我使用龙卷风来做一个简单的websocket客户端来获取推送,但我不知道如何在另一个文件中处理tornado.queues。 使用print(que.get())获取类似于<tornado.concurrent.Future object at 0x106a940b8>

的数据

a.py

from tornado.ioloop import IOLoop, PeriodicCallback
from tornado import gen
from tornado.websocket import websocket_connect
from tornado.queues import Queue
que = Queue()
class Client(object):
    def __init__(self):
        self.ioloop = IOLoop.instance()
        self.connect()
        self.ioloop.start()
    @gen.coroutine
    def connect(self):
        ws = yield websocket_connect('ws://127.0.0.1:8001/')
        while True:
            msg = yield ws.read_message()
            que.put(msg)
            print(que.get())
if __name__ == '__main__':
    Client()

b.py

import a
awe = a.que
while True:
    print(awe.get())

b.py如何输出a.py数据?

我很快就会触摸python,如果可能的话,请发布完整的代码,谢谢:)

1 个答案:

答案 0 :(得分:0)

tornado.queue.Queue不是线程安全的,旨在用于通常是单线程和事件驱动的Tornado应用程序。你需要做两件事之一:

  1. 在任何地方使用Tornado并使b.py使用协同程序和事件,遵循与阻止代码相同的限制,与Tornado中的其他地方一样。

    # b.py
    import a
    @gen.coroutine
    def f():
        while True:
            print((yield a.que.get())
    
  2. 使用标准库中的线程安全queue.Queue。从Tornado写入无限制的线程安全队列很容易(使用put_nowait())。从一个读取(或写入有界队列)比较棘手,将线程专用于任务通常最简单(除非你有大量的队列):

    # a.py
    que = queue.Queue()
    executor = concurrent.futures.ThreadPoolExecutor()
    @gen.coroutine
    def connect(self):
        ws = yield websocket_connect(...)
        while True:
            msg = yield ws.read_message()
            que.put_nowait(msg)
            print((yield executor.submit(que.get)))