loop.add_signal_handler(
getattr(signal, signame),
lambda: asyncio.ensure_future(shutdown(signame, loop))
)
Здесь, используя asyncio.ensure_future
, вы создаете задачу для shutdown
сопрограммы, но нигде не ждете завершения этой задачи.Позже, когда вы закрываете цикл событий, он предупреждает вас о том, что эта задача еще не завершена.
Upd:
Если вы хотите выполнить некоторую очистку, лучшее место для этогопрямо перед loop.close()
независимо от причины, по которой ваш скрипт завершился (сигнал, исключение и т. д.)
Попробуйте изменить код следующим образом:
# ...
async def shutdown(loop): # remove `signal` arg
# ...
def main():
try:
loop = asyncio.get_event_loop()
try:
pull(loop)
except Exception:
print(traceback.format_exc())
finally:
loop.run_until_complete(shutdown(loop)) # just run until shutdown is done
loop.close()
finally:
print("Done")
# ...
Upd2:
Если вам все еще нужен обработчик сигнала, вы, вероятно, захотите сделать что-то вроде этого:
from functools import partial
loop.add_signal_handler(
getattr(signal, signame),
partial(cb, signame, loop)
)
def cb(signame, loop):
loop.stop()
loop.run_until_complete(shutdown(signame, loop))