Python 点的太快出现 RuntimeError: dictionary changed size during iteration 报错

2019-01-28 16:28:05 +08:00
 334862132
用的 web.py 搞了一个 app,有的时候个别接口如果点的太快会出现标题里面的报错,跳出去重新点就没事了,影响倒是没有,就是看着很不爽,求一个解决版本
2977 次点击
所在节点    Python
10 条回复
vipppppp
2019-01-28 16:32:10 +08:00
你这样鬼知道什么问题啊
看报错就是你进行迭代的时候对字典进行了增加或者减少操作, 例如:
a = {1: 2, 3: 4, 5: 6, 7: 8}

for x in a:
a.pop(1)

就会报这个错
HypoChen
2019-01-28 16:32:19 +08:00
字面上看,像是在 for 循环的时候,字典被修改了(新增? pop ?)
janxin
2019-01-28 16:33:02 +08:00
先拷贝一份再使用? and 不要随意修改多个线程访问的数据
HypoChen
2019-01-28 16:33:47 +08:00
建议:
1. 如果经常修改,不要用全局的字典(请求间隔离)
2. 如果需要共享,建议加锁
neoblackcap
2019-01-28 17:28:50 +08:00
我初步估计就是如 4 楼说的一样,用了一个字典作为全局变量,一并发就挂了。最无脑就是加锁罗
pythongo
2019-01-28 17:37:08 +08:00
这不是 py 的锅,我不背
Philippa
2019-01-28 17:58:40 +08:00
这是多进程字典被修改时不要去 for 它,你可以用 multiprocessing Manager dict 复现这个问题。要么加锁要么使用前弄个 copy。而且边写边读很难 debug
lynskylate
2019-01-28 20:04:17 +08:00
经典的迭代器失效问题,如上加锁或者局部字典
XxxxD
2019-01-28 20:33:19 +08:00
根据楼上
for i in x.copy():
334862132
2019-02-02 10:05:00 +08:00
@lynskylate 谢谢 说到迭代器失效 我发现我代码里面有字典用字典生成式写的 字典生成式好像引用了迭代器原理 我已经放假了 等回去后把字典生成式替换了试一下

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

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

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

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

© 2021 V2EX