2017-10-20 8 views
0

私はプッシュを得るために単純なwebsocketクライアントを実行するために竜巻を使用しましたが、別のファイルでtornado.queuesを処理する方法がわかりません。 プリントを使用すると、(que.get())どのようにすることができますI出力b.py <tornado.concurrent.Future object at 0x106a940b8>外部からtornado.queuesメッセージを呼び出す方法

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()) 

と同様のデータを取得します。 pyデータ?

私はちょうどすぐのpythonに触れ、可能な場合は、完全なコードを投稿してください、ありがとう:)

答えて

0

tornado.queue.Queueはスレッドセーフではなく、一般的にシングルスレッドとイベント駆動型ですトルネードアプリケーション内で使用するためのものです。どこでも

  1. 使用トルネードや他の場所での竜巻のようなコードをブロックに同じ制限以下、b.py使用コルーチンとイベントを行います。あなたは、2つのいずれかを行う必要があります。

    # b.py 
    import a 
    @gen.coroutine 
    def f(): 
        while True: 
         print((yield a.que.get()) 
    
  2. スレッドセーフqueue.Queue標準ライブラリから使用してください。 Tornadoの無制限スレッドセーフキューへの書き込みは簡単です(put_nowait()を使用)。 1からの読み込み(または有界キューへの書き込みは)複雑です、それはタスク(あなたは、キューの数が多い場合を除く)にスレッドを捧げるために、多くの場合、最も簡単です:

    # 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))) 
    
関連する問題