2017-10-20 6 views
0

J'ai utilisé tornade pour faire un simple client websocket pour obtenir le push, mais je ne sais pas comment gérer tornado.queues dans un autre fichier. L'utilisation d'impression (que.get()) pour obtenir les données similaires à <tornado.concurrent.Future object at 0x106a940b8>Comment appeler le message tornado.queues en externe

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 comment puis-je produire un. py données?

je touche juste python bientôt, si possible, s'il vous plaît poster le code complet, merci :)

Répondre

0

tornado.queue.Queue est thread-safe et est destiné à être utilisé dans les applications Tornado qui sont généralement mono-thread et évènementielle . Vous devez faire une des deux choses:

  1. Utiliser Tornado partout et faire b.py utilisation coroutines et des événements, suivant les mêmes restrictions sur le code de blocage comme ailleurs dans Tornado.

    # b.py 
    import a 
    @gen.coroutine 
    def f(): 
        while True: 
         print((yield a.que.get()) 
    
  2. Utilisez le thread-safe queue.Queue de la bibliothèque standard. L'écriture dans une file d'attente thread-safe non bornée depuis Tornado est facile (utilisez put_nowait()). Lecture d'un (ou d'écrire à une file d'attente bornée) est plus délicate et il est souvent plus facile de consacrer un fil à la tâche (sauf si vous avez un grand nombre de files d'attente):

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