0

我正在尝试将 asyncpg 与 discord.py 集成,但是我遇到了一个非常烦人的问题。

每当我尝试使用 ^C 停止机器人时,都会收到大量错误信息。这很麻烦,因为当我尝试调试某些东西时,我经常会丢失原始错误。

这是我的代码:

loop = asyncio.get_event_loop()

async def connection_init(conn):
    await conn.execute("SET CLIENT_ENCODING to 'utf-8';")
    conn.client = client

try:
    client.pool = loop.run_until_complete(asyncpg.create_pool(
        host=os.environ.get("postgres_host"),
        database=os.environ.get("postgres_database"),
        user=os.environ.get("postgres_user"),
        password=os.environ.get("postgres_password"),
        connection_class=dbutils.DBUtils,
        init=connection_init
    ))

    print('PostgreSQL connection successful')
except Exception as e:
    print(e)

    # the bot basically cannot function without database
    print('PostgreSQL connection failed- aborting')
    exit()


client.run(os.environ.get("main"))

这是淹没我的终端的错误。这是同样的错误,但它会弹出 20 次。

Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x033DF148>
Traceback (most recent call last):
  File "C:\Users\zghan\AppData\Local\Programs\Python\Python38-32\lib\asyncio\proactor_events.py", line 116, in __del__
  File "C:\Users\zghan\AppData\Local\Programs\Python\Python38-32\lib\asyncio\proactor_events.py", line 108, in close
  File "C:\Users\zghan\AppData\Local\Programs\Python\Python38-32\lib\asyncio\base_events.py", line 719, in call_soon
  File "C:\Users\zghan\AppData\Local\Programs\Python\Python38-32\lib\asyncio\base_events.py", line 508, in _check_closed
RuntimeError: Event loop is closed
4

1 回答 1

0

发生该错误是因为asyncio.get_event_loop()无法检索任何循环,因为在您尝试检索它时,它已经关闭。

正确的语法是开始一个新循环,而不是尝试获取当前循环:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(asyncio.new_event_loop())
# ...
loop = asyncio.get_event_loop()

或者,在 Python 3.7 中,asyncio 添加了一种管理循环的新方法: using asyncio.run(),它不需要您创建、设置或检索当前循环,因为它已经在内部管理了所有这些。

于 2021-01-22T05:43:00.453 回答