2017-04-04 6 views
0

Ich habe Schwierigkeiten, Python Asyncio NATS.io sequenziell zu machen. Ich habe zwei Klassen: Account und Bridge Konto hält die Logik der Anwendung und es kommuniziert Gedanken Bridge mit externen Dienst über NATS.io.Python: Asyncio NATS.io blockiert

Main Datei:

loop = asyncio.get_event_loop() 
account = Account(loop, options) 
asyncio.async(account.start()) 
loop.run_forever() 

Account Klasse:

class Account: 
    bridge = Bridge() 

    def connect(self): 
     result = self.bridge.connect(self.id) 
     return result 

Bridge Klasse:

def connect(self, account_id): 
    data = None 

    try: 
     response = yield from self.nc.timed_request("bank.account.connect", 
        BankRequest(
          method="connect", 
          data={...} 
        ), 10) 
     data = json.loads(response.data.decode()) 
    except ErrTimeout: 
     status = Messages.REQUEST_TIMED_OUT 

    return Result(data=data) 

Ich brauche account.connect() rufen von überall innerhalb Kontoklasse und das Ergebnis der Verbindung zu erhalten (sequentiell). Jetzt erhalte ich generator Objekt

Antwort

0

Ihre connect() Methoden sollten wahrscheinlich Koroutinen sein:

class Account: 
    bridge = Bridge() # you probably want to put this in `def __init__(self)`! 

    @asyncio.coroutine 
    def connect(self): 
     result = yield from self.bridge.connect(self.id) 
     return result 

class Bridge: 
    @asyncio.coroutine 
    def connect(self, account_id): 
     data = None 

     try: 
      response = yield from self.nc.timed_request("bank.account.connect", 
         BankRequest(
           method="connect", 
           data={...} 
         ), 10) 
      data = json.loads(response.data.decode()) 
     except ErrTimeout: 
      status = Messages.REQUEST_TIMED_OUT 

     return Result(data=data) 

und:

resp = yield from account.connect()