2017-07-08 94 views
3
async def start(channel): 
    while True: 
     m = await client.send_message(channel, "Generating... ") 
     generator.makeFile() 
     with open('tmp.png', 'rb') as f: 
      await client.send_file(channel, f) 
     await client.delete_message(m) 
     await asyncio.sleep(2) 

我有一個不和諧的機器人,每2秒運行一次任務。我試着用一個無限循環來做這個,但腳本崩潰了Task was destroyed but it is still pending!我已經閱讀了關於asyncio的協同程序,但是我發現沒有一個例子使用await。例如,運行一個協程爲await可以避免這個錯誤嗎?Asyncio,等待和無限循環

+0

'await'在這裏不是問題。更多'while True'也是定期調用的常用方式(https://stackoverflow.com/questions/37512182/how-can-i-periodically-execute-a-function-with-asyncio)。顯示如何執行該功能,你是否試圖停止代碼中的任務? – kwarunek

回答

2

Task was destroyed but it is still pending!當您的腳本中的某些tasks未完成時,您會收到當您撥打loop.close()時收到的警告。通常你應該避免這種情況,因爲未完成的任務可能不會釋放一些資源。您需要等待已完成的任務,或者在事件循環關閉之前執行任務cancel

既然你有無限循環,你可能會需要取消任務,例如:

import asyncio 
from contextlib import suppress 


async def start(): 
    # your infinite loop here, for example: 
    while True: 
     print('echo') 
     await asyncio.sleep(1) 


async def main(): 
    task = asyncio.Task(start()) 

    # let script some thime to work: 
    await asyncio.sleep(3) 

    # cancel task to avoid warning: 
    task.cancel() 
    with suppress(asyncio.CancelledError): 
     await task # await for task cancellation 


loop = asyncio.new_event_loop() 
asyncio.set_event_loop(loop) 
try: 
    loop.run_until_complete(main()) 
finally: 
    loop.run_until_complete(loop.shutdown_asyncgens()) 
    loop.close() 

this answer請參閱有關任務的詳細信息。

+0

[該答案](https://stackoverflow.com/a/37345564/1113207)完美解決它,謝謝。 這個例子運行良好,但似乎要求無限循環會停止在某個點或另一個點。 – user8245289