首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >aiomysql中出现“事件循环已关闭”错误

aiomysql中出现“事件循环已关闭”错误
EN

Stack Overflow用户
提问于 2016-11-04 18:22:58
回答 2查看 750关注 0票数 2

我在使用peewee-async查询MySQL时遇到了问题(反过来使用aiomysql)

以下是我的代码(我认为它与peewee-async文档中的示例几乎相同):

代码语言:javascript
运行
复制
import asyncio
import peewee
import peewee_async

database = peewee_async.MySQLDatabase(None)


class BaseModel(peewee.Model):
    id = peewee.IntegerField(primary_key=True)

    class Meta:
        database = database


class User(BaseModel):
    name = peewee.CharField(unique=True)
    password = peewee.CharField()
    role = peewee.CharField()


def get_db(config, loop=None):
    database.init(config['database'], user=config['user'], password=config['password'],
                  host=config['host'], port=config['port'])
    objects = peewee_async.Manager(database, loop=loop)
    objects.allow_sync = False
    return objects


async def print_users(db):
    users = await db.execute(User.select())
    for user in users:
        print(user.id, user.name)


if __name__ == '__main__':
    conf = {
        'database': 'db',
        'user': 'user',
        'password': 'secret',
        'host': 'localhost',
        'port': 3306
    }

    loop = asyncio.get_event_loop()
    db = get_db(conf, loop=loop)

    loop.run_until_complete(print_users(db))

现在,当我执行它时,它会查询和打印用户(在我的例子中是1个用户)。但是随后,它抛出了异常:

代码语言:javascript
运行
复制
(env)user@Private-006:~/project$ python tst.py
1 test
Exception ignored in: <bound method Connection.__del__ of <aiomysql.connection.Connection object at 0x7f37ce016978>>
Traceback (most recent call last):
  File "/home/user/project/env/lib/python3.5/site-packages/aiomysql/connection.py", line 802, in __del__
  File "/home/user/project/env/lib/python3.5/site-packages/aiomysql/connection.py", line 269, in close
  File "/usr/lib/python3.5/asyncio/selector_events.py", line 566, in close
  File "/usr/lib/python3.5/asyncio/base_events.py", line 497, in call_soon
  File "/usr/lib/python3.5/asyncio/base_events.py", line 506, in _call_soon
  File "/usr/lib/python3.5/asyncio/base_events.py", line 334, in _check_closed
RuntimeError: Event loop is closed

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2016-11-04 18:41:14

好的。似乎在最后添加loop.run_until_complete(db.close())会有所帮助。让我们暂时把这个当作答案,直到有人解释为什么我们应该显式关闭manager,以及为什么peewee-async文档中没有提到这一点。

票数 1
EN

Stack Overflow用户

发布于 2018-10-25 00:24:39

我遇到了同样的问题。我有两种解决方案,代码如下:

首先,调用数据库的close_async方法:

代码语言:javascript
运行
复制
await database.close_async()

第二,

代码语言:javascript
运行
复制
await objects.close()

阅读源代码,你会发现objects.close()调用了database.close_async()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40420243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档