2017-07-30 49 views
0

我試圖使用協程來發送數據到NATS(nats.io消息系統)。協同程序收益繼續主

當我嘗試調用這個代碼沒有參數和循環它的工作完美。

但是當我添加參數時,產生nc.connect函數不會返回任何東西並繼續執行main函數。

如何用參數調用任何協程?

@tornado.gen.coroutine 
def process_events_list(events): 
    try: 
     nc = NATS() 
     parser = SafeConfigParser() 
     conf = os.path.realpath(
     os.path.join(os.getcwd(),'ev_nats\\ev_nats.ini')) 
     parser.read(conf) 
     endpoints = ast.literal_eval(parser.get('Nats', 'Servers')) 
     subject = parser.get('Nats', 'Subject') 
     opts = {"servers": endpoints} 
     **yield nc.connect(**opts)** # wont connect return to main   
     for ev in events: 
      yield nc.publish(subject, ev) 
     yield nc.flush() 
     log("Published") 
    except Exception, e: 
     log(e) 

if __name__=='__main__': # if run directly, not called by event_dispatcher.py 
    evt = ['1','2','3'] 
    tornado.ioloop.IOLoop.instance().run_sync(lambda : process_events_list(evt)) 

回答

0

我會嘗試進一步調試您傳遞給服務器的端點列表是否有效。否則,如果可以連接到服務器,則應該這樣做。

# coding: utf-8 
import tornado.ioloop 
import tornado.gen 
from nats.io.client import Client as NATS 

@tornado.gen.coroutine 
def main(events): 
    print("Args:", events) 
    nc = NATS() 

    # Establish connection to the server. 
    options = { "servers": ["nats://127.0.0.1:4222"] } 
    yield nc.connect(**options) 

    for e in events: 
     yield nc.publish("example", "event:{}".format(e)) 

if __name__ == '__main__': 
    events = ['1', '2', '8'] 
    tornado.ioloop.IOLoop.instance().run_sync(lambda: main(events))