Python 字典get()抛出键错误

Python 字典get()抛出键错误,python,dictionary,concurrency,python-asyncio,sanic,Python,Dictionary,Concurrency,Python Asyncio,Sanic,我使用python字典保持一个简单的连接池。作为参考,我在Sanic内部使用asyncio,如果这很重要的话 不经常,但有时我会遇到这样的错误: Traceback (most recent call last): File "/Users/Documents/venv/lib/python3.6/site-packages/sanic/app.py", line 556, in handle_request response = await response File "/us

我使用python字典保持一个简单的连接池。作为参考,我在Sanic内部使用asyncio,如果这很重要的话

不经常,但有时我会遇到这样的错误:

Traceback (most recent call last):
  File "/Users/Documents/venv/lib/python3.6/site-packages/sanic/app.py", line 556, in handle_request
    response = await response
  File "/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py", line 110, in __next__
    return self.gen.send(None)
  File "/Users/Documents/Project/<proj>/<dir>/devices/services.py", line 181, in dev_execute_cmd
    return HTTPResponse(output, content_type='application/json')
  File "/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py", line 110, in __next__
    return self.gen.send(None)
  File "/Users/Documents/Project/<proj>/<dir>/devices/services.py", line 132, in dev_execute_cmd
    uid, last_cmd, mode)
  File "/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py", line 110, in __next__
    return self.gen.send(None)
  File "/Users/Documents/Project/<proj>/<dir>/devices/managers.py", line 260, in async_dev_execute_cmd
    # return False if max connections have been exceeded
  File "/usr/local/Cellar/python/3.6.4_4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py", line 110, in __next__
    return self.gen.send(None)
  File "/Users/Documents/Project/<proj>/<dir>/devices/managers.py", line 122, in async_open_connection
    ip_addr_conn_count = self.per_dev_conn_count.get(device.ip_addr, 0) + 1
KeyError: '10.32.255.80'
回溯(最近一次呼叫最后一次):
文件“/Users/Documents/venv/lib/python3.6/site packages/sanic/app.py”,第556行,在handle_请求中
响应=等待响应
文件“/usr/local/ceral/python/3.6.4_4/Frameworks/python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py”,第110行,下一行__
返回self.gen.send(无)
dev_execute_cmd中的文件“/Users/Documents/Project///devices/services.py”,第181行
返回HTTPResponse(输出,content_type='application/json')
文件“/usr/local/ceral/python/3.6.4_4/Frameworks/python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py”,第110行,下一行__
返回self.gen.send(无)
dev_execute_cmd中的文件“/Users/Documents/Project///devices/services.py”,第132行
uid,最后一个命令,模式)
文件“/usr/local/ceral/python/3.6.4_4/Frameworks/python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py”,第110行,下一行__
返回self.gen.send(无)
文件“/Users/Documents/Project///devices/managers.py”,第260行,在async_dev_execute_cmd中
#如果已超过最大连接数,则返回False
文件“/usr/local/ceral/python/3.6.4_4/Frameworks/python.framework/Versions/3.6/lib/python3.6/asyncio/coroutines.py”,第110行,下一行__
返回self.gen.send(无)
文件“/Users/Documents/Project///devices/managers.py”,第122行,异步\u打开\u连接
ip地址连接计数=self.per\u dev\u conn\u count.get(device.ip\u addr,0)+1
KeyError:'10.32.255.80'
我的问题是-使用
.get()
怎么可能出现关键错误?在什么情况下会发生这种情况?我注意到的一件事是,这个错误只在我运行并发请求时发生,尽管很少发生

据我所知,asyncio使用事件循环来安排任务,并在等待时暂停任务。所以在我看来,2+并发请求永远不应该同时命中同一个字典


提前谢谢

你能检查一下self.per_dev_conn_count的类型吗?嗯,你可能想检查一下*.pyc文件@Jean Françoisfare good point!我确实检查过了,它不断地说://Freddier我会检查的!但是我以前删除了所有的.pyc文件,所以我想不会是这样。但我会仔细检查的,奇怪!我会在故障线路之前打印(self.per\u dev\u conn\u count)。是的,我在调试过程中也这样做了——我在故障线路之前和之后打印字典。很好。(显示之前未更新的状态和之后未更新的状态)只是偶尔,并且只有在异步IO中执行并发操作时,才会出现此错误。超级奇怪。。。