我使用龙卷风来做一个简单的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,如果可能的话,请发布完整的代码,谢谢:)
答案 0 :(得分:0)
tornado.queue.Queue
不是线程安全的,旨在用于通常是单线程和事件驱动的Tornado应用程序。你需要做两件事之一:
在任何地方使用Tornado并使b.py
使用协同程序和事件,遵循与阻止代码相同的限制,与Tornado中的其他地方一样。
# b.py
import a
@gen.coroutine
def f():
while True:
print((yield a.que.get())
使用标准库中的线程安全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)))