Есть ли способ запустить сопрограмму asyncio с помощью atexit? - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над ботом, используя `discord.py.Бот создает / удаляет несколько каналов и подключается к базе данных SQLite.Если бот потерпит крах, я хочу, чтобы он

  1. уничтожил все созданные им временные голосовые каналы.
  2. Отключился от базы данных SQL.

Вотсопрограмма выключения:

async def shutdown(self):
    print("Shutting down Canvas...")
    for ch in self.active_channels:
        await client.delete_channel(ch)
    self.db.close()

То, что я пробовал:

# Canv is the interface between the bot and the data we're collecting
atexit.register(canv.shutdown) 
bot.run(TOKEN)

try:
    bot.loop.run_until_complete(bot.start(TOKEN))
except KeyboardInterrupt or InterruptedError:
    bot.loop.run_until_complete(canv.shutdown())
finally:
    bot.loop.close()

from async_generator import asynccontextmanager

@asynccontextmanager
async def cleanup_context_manager():
    try:
        yield
    finally:
        await canv.shutdown()

with cleanup_context_manager():
    bot.run(TOKEN)

Ни один из этих прогонов canv.shutdown(), которыйasyncio.coroutine.Как убедиться, что этот код запускается на каждый тип выхода?

Я использовал этот пост для некоторой информации, и я думаю, что он ближе всего к тому, что я хочу.

1 Ответ

0 голосов
/ 06 декабря 2018

Попробуйте:

try:
    bot.loop.run_until_complete(bot.start(TOKEN))
finally:
    bot.loop.run_until_complete(canv.shutdown())
    bot.loop.close()

Вы хотите удалить каналы и закрыть дб при каждом отключении скрипта, не только при сбое, верно?

В противном случае попробуйте:

try:
    bot.loop.run_until_complete(bot.start(TOKEN))
except Exception:
    bot.loop.run_until_complete(canv.shutdown())
    raise
finally:
    bot.loop.close()

Обновление:

По предоставленной вами ссылке:

Информация об исключении и самом исключении могут быть получены с помощью стандарта.вызов sys.exc_info ().

Давайте попробуем:

import sys

try:
    bot.loop.run_until_complete(bot.start(TOKEN))
finally:
    if sys.exc_info() != (None, None, None):
        bot.loop.run_until_complete(canv.shutdown())
    bot.loop.close()
...