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