2

我正在使用 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 使用事件循环,因此它会在等待时安排任务并暂停任务。所以在我看来,两个以上的并发请求永远不应该同时击中同一个字典。

提前致谢!

4

0 回答 0