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

2017-01-15 17:51:54 +08:00
 tire

纯小白,顺着廖雪峰的 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='test@example.com',
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='test@example.com',
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='test@example.com',
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工作还需要熟悉哪些模块?

7144 次点击
所在节点    Python
21 条回复
laoyuan
2017-01-15 19:04:49 +08:00
好歹你放个教程的链接啊
tire
2017-01-15 19:16:03 +08:00
hcymk2
2017-01-15 20:47:58 +08:00
@tire
destroy_pool() 这个是你新定义的方法 还是 orm 定义的?
tire
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
2017-01-15 20:52:53 +08:00
@tire
那你怎么在 test()调用 destroy_pool() 这个方法的
tire
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='test@example.com',
passwd='1234567890', image='about:blank')
await u.save()
await destroy_pool() #销毁连接池
hcymk2
2017-01-15 21:04:30 +08:00
tire
2017-01-15 21:14:17 +08:00
什么意思,解释一下呗
@hcymk2
hcymk2
2017-01-15 21:21:24 +08:00
@tire
前面那些内容要看一点吧 , 不能直接就看实战吧。
await orm.destroy_pool()
tire
2017-01-15 21:28:44 +08:00
@hcymk2
之前是看了,但是印象肯定不深的,只能回去补,主要是不知道是哪个知识点的问题,刚才这个使用模块不知道跟我这个坑哪里有关联
AlisaDestiny
2017-01-15 21:31:14 +08:00
@tire 哈哈。同道中人啊。我也是看廖老师的网站学的 Python 。不过我知道把项目搭建起来并且测试几个 API 成功了,并没有把整个项目做完。你这个问题我是在教程的评论里找到答案的。你可以仔细看下下面的评论。
bonfy
2017-01-15 21:33:15 +08:00
liaoxuefeng 的教程是可以评论的,直接把问题提给作者不行么?
Yourshell
2017-01-15 21:33:37 +08:00
我一直跟着教程走,然后到实战 day2 就蒙逼了。
tire
2017-01-15 21:58:02 +08:00
@AlisaDestiny 就是按照评论里的方法来的,看着他们开心的说解决了然而我并没有,我深深怀疑起了我的代码。。
tire
2017-01-15 22:02:35 +08:00
@bonfy 已评论,坐等解答了
tire
2017-01-15 22:05:35 +08:00
@Yourshell 我是自己注释+参考别人注释+参考评论+参考官方文档 葫芦吞枣下来的 也只是看个大概
重点要自己一步步注释上去,把一个个方法的用法看懂了,基本上意思就出来了 Day1 有个朋友给出了实战方法论回去再看看呗 别放弃啊 慢慢啃
slysly759
2017-01-17 00:09:35 +08:00
你可以参考我写的。我最近是将廖雪峰这个博客重构,去除 VUE 和 JINJA 的渲 restful 一些。你要是感兴趣可以在 github 上搜索 FuckBlog 找到我们。
另外 就目前来看 应该没有比我注释更详细的了→_→ 对了 我很有些是参考墨灵这位仁兄的,对了,看到你们这些小菜鸡出 BUG 真开心哈哈哈哈(逃
tire
2017-01-17 19:38:48 +08:00
@slysly759
看了你的代码,但是还是不知道问题出在哪里。菊花紧
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
2019-06-21 00:13:03 +08:00
# asyncio.set_event_loop(asyncio.new_event_loop())
asyncio.set_event_loop(loop)
尝试使用这 set_event_loop 再去关闭或者清空连接池

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX