python - REST API 上的 GUnicorn 和共享字典:高负载时出现“输入用尽”错误
问题描述
我正在使用 amanager.dict
在与 GUnicorn (与 Meinheld 工作人员)一起服务的 API 的多个工作人员之间同步一些数据。虽然这适用于一些并发查询,但当我在 API 上同时触发大约 100 个查询时它会中断,并且会显示以下堆栈跟踪:
2020-07-16 12:35:38,972-app.api.my_resource-ERROR-140298393573184-on_post-175-Ran out of input
Traceback (most recent call last):
File "/app/api/my_resource.py", line 163, in on_post
results = self.do_something(a, b, c, **d)
File "/app/user_data/data_lookup.py", line 39, in lookup_something
return (a in self._shared_dict
File "<string>", line 2, in __contains__
File "/usr/local/lib/python3.6/multiprocessing/managers.py", line 757, in _callmethod
kind, result = conn.recv()
File "/usr/local/lib/python3.6/multiprocessing/connection.py", line 251, in recv
return _ForkingPickler.loads(buf.getbuffer())
EOFError: Ran out of input
2020-07-16 12:35:38,972-app.api.my_resource-ERROR-140298393573184-on_post-175-unpickling stack underflow
Traceback (most recent call last):
File "/app/api/my_resource.py", line 163, in on_post
results = self.do_something(a, b, c, **d)
File "/app/user_data/data_lookup.py", line 39, in lookup_something
return (a in self._shared_dict
File "<string>", line 2, in __contains__
File "/usr/local/lib/python3.6/multiprocessing/managers.py", line 757, in _callmethod
kind, result = conn.recv()
File "/usr/local/lib/python3.6/multiprocessing/connection.py", line 251, in recv
return _ForkingPickler.loads(buf.getbuffer())
_pickle.UnpicklingError: unpickling stack underflow
我的 API 框架是falcon。我有一个包含可以通过 POST 请求更新的用户数据的字典。架构应该很简单,所以我选择Manager.dict()
从multiprocessing
包中存储数据。在进行其他查询时,将根据该字典 ( if a in self._shared_dict: ...
) 的内容检查这些输入。这就是发生上述错误的地方。
为什么会出现这个问题?它似乎与manager.dict
. 此外,当我在 PyCharm 中进行调试时,调试器也不会评估任何变量,并且通常只是无限地挂在multiprocessing
等待数据的代码中的某个地方。
解决方案
这似乎与Meinheld
工人有关。当我将 GUnicorn 配置为使用默认sync
工作类时,此错误不再发生。因此,Pythonmultiprocessing
和Meinheld
包在我的设置中似乎不能很好地工作。
推荐阅读
- typescript - 如何在 React Navigation 中正确键入 useNavigation?
- html - 引导轮播进入模态的问题:指标不起作用
- neo4j - 如何在 Neo4j Query 中获取唯一的节点
- sql - SQL 获取字符之间或字符串结尾的字符串
- r - 使用 tidyverse 添加具有每组块数的列
- ios - @Published ObservableObject 未更新 SwiftUI 视图
- node.js - 'npm run dev' 突然坏了,出现奇怪的错误
- xwiki - 通过 REST API 导出和导入 XWiki 页面
- apache - Apache Mod QOS 阻止所有用户
- .net - 长时间运行的后台任务按进程 .NET 隔离