V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tire
V2EX  ›  Python

解救帖:廖雪峰教程 Day 4 - 编写 Model RuntimeError: Event loop is closed 卡得我蛋都碎了

  •  
  •   tire · 2017-01-15 17:51:54 +08:00 · 7130 次点击
    这是一个创建于 2851 天前的主题,其中的信息可能已经有所发展或是发生改变。

    纯小白,顺着廖雪峰的 python 教程往下走,好不容易走到实战 Day 4 - 编写 Model ,蛋疼连续剧开始了 蛋疼第一期:
    #test.py(下面首行都没有缩进,不知道怎么缩进,先忽略不看)
    import asyncio, orm
    from models import User, Blog, Comment
    loop = asyncio.get_event_loop()

    async def test():
    await orm.create_pool(loop=loop,host='localhost', port=3306,
    user='www-data', password='www-data', database='awesome')
    u = User(name='Test', email='[email protected]',
    passwd='1234567890', image='about:blank')
    await u.save()

    loop.run_until_complete(test())
    loop.close()

    结果报错: RuntimeError: Event loop is closed

    蛋疼第二期:参考评论建议,在 loop.close()后加入一个 sys.exit()语句
    import asyncio, orm
    from models import User, Blog, Comment
    loop = asyncio.get_event_loop()

    async def test():
    await orm.create_pool(loop=loop,host='localhost', port=3306,
    user='www-data', password='www-data', database='awesome')
    u = User(name='Test', email='[email protected]',
    passwd='1234567890', image='about:blank')
    await u.save()

    loop.run_until_complete(test())
    loop.close()
    #加入 sys.exit()语句
    if loop.is_closed():
    sys.exit(0)

    结果报错: RuntimeError: Event loop is closed (并没有什么软用)

    蛋疼第三期:
    参考评论建议,在关闭 event loop 之前,首先需要关闭连接池,所以增加
    了销毁连接池的方法
    orm.py 中定义 destroy_pool()方法:
    async def destroy_pool():
    #声明全局变量
    global __pool
    #如果__pool 不为空
    if __pool is not None:
    #关闭__pool
    __pool.close()
    #异步调用__pool.wait_closed(), wait_closed()用于等待直到 close()方法完成
    await __pool.wait_closed()

    然后修改 test.py 代码:
    import asyncio, orm
    from models import User, Blog, Comment
    loop = asyncio.get_event_loop()

    async def test():
    await orm.create_pool(loop=loop,host='localhost', port=3306,
    user='www-data', password='www-data', database='awesome')
    u = User(name='Test', email='[email protected]',
    passwd='1234567890', image='about:blank')
    await u.save()
    await destroy_pool() #销毁连接池

    loop.run_until_complete(test())
    loop.close()
    结果报错: timeError: Event loop is closed (看评论别人都解决了为何我还是蛋疼)

    蛋疼第四期:询问朋友,朋友说看这里 http://stackoverflow.com/questions/32598231/asyncio-runtimeerror-event-loop-is-closed

    结果报错: I don ’ t understand (英文和中文理解力都不够)

    抱着在杭州找到一份 python 工作的目的,求 v 友解救,带我出坑,手动抱拳
    还有,按照我目前的进度,想快速找到python工作还需要熟悉哪些模块?

    21 条回复    2019-10-16 18:00:15 +08:00
    laoyuan
        1
    laoyuan  
       2017-01-15 19:04:49 +08:00
    好歹你放个教程的链接啊
    hcymk2
        3
    hcymk2  
       2017-01-15 20:47:58 +08:00
    @tire
    destroy_pool() 这个是你新定义的方法 还是 orm 定义的?
    tire
        4
    tire  
    OP
       2017-01-15 20:49:40 +08:00
    orm.py 中定义的 destroy_pool()方法:
    async def destroy_pool():
    global __pool
    if __pool is not None:
    __pool.close()
    await __pool.wait_closed()
    @hcymk2
    hcymk2
        5
    hcymk2  
       2017-01-15 20:52:53 +08:00
    @tire
    那你怎么在 test()调用 destroy_pool() 这个方法的
    tire
        6
    tire  
    OP
       2017-01-15 20:58:24 +08:00
    我在 save()之后调用 destroy_pool()方法的,就是销毁这个连接池 @hcymk2
    async def test():
    await orm.create_pool(loop=loop,host='localhost', port=3306,
    user='www-data', password='www-data', database='awesome')
    u = User(name='Test', email='[email protected]',
    passwd='1234567890', image='about:blank')
    await u.save()
    await destroy_pool() #销毁连接池
    tire
        8
    tire  
    OP
       2017-01-15 21:14:17 +08:00
    什么意思,解释一下呗
    @hcymk2
    hcymk2
        9
    hcymk2  
       2017-01-15 21:21:24 +08:00
    @tire
    前面那些内容要看一点吧 , 不能直接就看实战吧。
    await orm.destroy_pool()
    tire
        10
    tire  
    OP
       2017-01-15 21:28:44 +08:00
    @hcymk2
    之前是看了,但是印象肯定不深的,只能回去补,主要是不知道是哪个知识点的问题,刚才这个使用模块不知道跟我这个坑哪里有关联
    AlisaDestiny
        11
    AlisaDestiny  
       2017-01-15 21:31:14 +08:00
    @tire 哈哈。同道中人啊。我也是看廖老师的网站学的 Python 。不过我知道把项目搭建起来并且测试几个 API 成功了,并没有把整个项目做完。你这个问题我是在教程的评论里找到答案的。你可以仔细看下下面的评论。
    bonfy
        12
    bonfy  
       2017-01-15 21:33:15 +08:00
    liaoxuefeng 的教程是可以评论的,直接把问题提给作者不行么?
    Yourshell
        13
    Yourshell  
       2017-01-15 21:33:37 +08:00
    我一直跟着教程走,然后到实战 day2 就蒙逼了。
    tire
        14
    tire  
    OP
       2017-01-15 21:58:02 +08:00
    @AlisaDestiny 就是按照评论里的方法来的,看着他们开心的说解决了然而我并没有,我深深怀疑起了我的代码。。
    tire
        15
    tire  
    OP
       2017-01-15 22:02:35 +08:00
    @bonfy 已评论,坐等解答了
    tire
        16
    tire  
    OP
       2017-01-15 22:05:35 +08:00
    @Yourshell 我是自己注释+参考别人注释+参考评论+参考官方文档 葫芦吞枣下来的 也只是看个大概
    重点要自己一步步注释上去,把一个个方法的用法看懂了,基本上意思就出来了 Day1 有个朋友给出了实战方法论回去再看看呗 别放弃啊 慢慢啃
    slysly759
        17
    slysly759  
       2017-01-17 00:09:35 +08:00 via Android
    你可以参考我写的。我最近是将廖雪峰这个博客重构,去除 VUE 和 JINJA 的渲 restful 一些。你要是感兴趣可以在 github 上搜索 FuckBlog 找到我们。
    另外 就目前来看 应该没有比我注释更详细的了→_→ 对了 我很有些是参考墨灵这位仁兄的,对了,看到你们这些小菜鸡出 BUG 真开心哈哈哈哈(逃
    tire
        18
    tire  
    OP
       2017-01-17 19:38:48 +08:00
    @slysly759
    看了你的代码,但是还是不知道问题出在哪里。菊花紧
    cowpea
        19
    cowpea  
       2018-10-05 02:40:14 +08:00
    实测,`sys.exit(0)` 可以的。
    要是你不可以,是不是没引入。没引入会报错
    ```
    Traceback (most recent call last):
    File "./user.py", line 18, in <module>
    sys.exit(0)
    NameError: name 'sys' is not defined

    ......
    ......

    RuntimeError: Event loop is closed
    ```

    我第一次也只看最下面报错,忽略上面了。引入后就好了。
    DOUWH
        20
    DOUWH  
       2019-06-21 00:13:03 +08:00
    # asyncio.set_event_loop(asyncio.new_event_loop())
    asyncio.set_event_loop(loop)
    尝试使用这 set_event_loop 再去关闭或者清空连接池
    tongtf
        21
    tongtf  
       2019-10-16 18:00:15 +08:00
    我就用第三期 销毁连接池的方法解决了这个问题啊。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:04 · PVG 22:04 · LAX 06:04 · JFK 09:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.