2016-01-06 51 views
1

我在遇到我致電api.say()失敗的問題。我知道它是一個協程,需要從中得到,但如果我的print_all是標準函數,那麼這個協議是有效的。從事件流中運行asyncio協同程序

什麼是構造這個例子的正確方法?

請假定客戶端不可更改,只有我的示例中的代碼。

from .client import Client 
import asyncio 

api = Client() 
login = ('', '') 

def print_all(b=None, m=None): 
    print("Buffer!", b) 
    print("Message", m) 

    if b and m: 
     if b.name == 'bat': 
      print("-sending to", b) 
      api.say(b, "Hey yo."): # <---- 


def main(): 
    api.login(*login) 
    api.register_message_callback(print_all) 
    api.register_state_callback(print_all) 

    loop = asyncio.get_event_loop() 
    loop.run_until_complete(api.run()) 
    loop.close() 

if __name__ == '__main__': 
    main() 

回答

1

客戶端API可以處理那些過於協程即回調,可以轉換成print_all()協同程序(前置asyncdef之前,api.say()前添加await)。

否則,你可以叫asyncio.ensure_future(api.say(..))調度協程。它假定以前api.say()完成即loop.run_until_complete(api.run())不會返回,也相當於在你的程序loop.run_forever()或您等待所有任務 - 無論是收集顯式或隱式(asyncio.Task.all_tasks())。

+0

謝謝'asyncio.ensure_future(api.say(..))'修復了這個問題。我的客戶沒有把回調作爲協程來處理,所以'.ensure_future(...)'把它整理出來。 – PsyKzz

相關問題