字典get()抛出键错误

时间:2018-04-10 17:05:20

标签: 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 "/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'

我的问题是 - 如何使用.get()进行关键错误?在什么情况下会发生这种情况?我注意到的一件事是,这个错误只发生在我很少运行并发请求时。

根据我的理解,asyncio使用事件循环,因此它会在等待时调度任务并暂停任务。所以在我看来,2 +多个并发请求永远不应该同时在同一个字典中。

提前致谢!

0 个答案:

没有答案