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
334862132
V2EX  ›  Python

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

  •  
  •   334862132 · 2019-01-28 16:28:05 +08:00 · 3104 次点击
    这是一个创建于 2157 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用的 web.py 搞了一个 app,有的时候个别接口如果点的太快会出现标题里面的报错,跳出去重新点就没事了,影响倒是没有,就是看着很不爽,求一个解决版本
    10 条回复    2019-02-02 10:05:00 +08:00
    vipppppp
        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)

    就会报这个错
    HypoChen
        2
    HypoChen  
       2019-01-28 16:32:19 +08:00   ❤️ 1
    字面上看,像是在 for 循环的时候,字典被修改了(新增? pop ?)
    janxin
        3
    janxin  
       2019-01-28 16:33:02 +08:00   ❤️ 1
    先拷贝一份再使用? and 不要随意修改多个线程访问的数据
    HypoChen
        4
    HypoChen  
       2019-01-28 16:33:47 +08:00   ❤️ 1
    建议:
    1. 如果经常修改,不要用全局的字典(请求间隔离)
    2. 如果需要共享,建议加锁
    neoblackcap
        5
    neoblackcap  
       2019-01-28 17:28:50 +08:00   ❤️ 1
    我初步估计就是如 4 楼说的一样,用了一个字典作为全局变量,一并发就挂了。最无脑就是加锁罗
    pythongo
        6
    pythongo  
       2019-01-28 17:37:08 +08:00   ❤️ 1
    这不是 py 的锅,我不背
    Philippa
        7
    Philippa  
       2019-01-28 17:58:40 +08:00 via Android   ❤️ 1
    这是多进程字典被修改时不要去 for 它,你可以用 multiprocessing Manager dict 复现这个问题。要么加锁要么使用前弄个 copy。而且边写边读很难 debug
    lynskylate
        8
    lynskylate  
       2019-01-28 20:04:17 +08:00 via Android   ❤️ 1
    经典的迭代器失效问题,如上加锁或者局部字典
    XxxxD
        9
    XxxxD  
       2019-01-28 20:33:19 +08:00   ❤️ 1
    根据楼上
    for i in x.copy():
    334862132
        10
    334862132  
    OP
       2019-02-02 10:05:00 +08:00
    @lynskylate 谢谢 说到迭代器失效 我发现我代码里面有字典用字典生成式写的 字典生成式好像引用了迭代器原理 我已经放假了 等回去后把字典生成式替换了试一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:08 · PVG 00:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.