python - 在 Python Flask 2.7 中使用 Multiprocessing 会挂起主应用程序,直到进程完成
问题描述
我已经建立了一个使用 Flask-SocketIO 的 Python (2.7) Flask 应用程序。我正在运行这个应用程序有点像这样
eventlet.monkey_patch(socket=True, select=True, subprocess=True)
socketio = SocketIO(app, cors_allowed_origins='*',
async_mode='eventlet')
socketio.run(app, host='0.0.0.0', debug=False,
port=5100)
现在,该应用程序运行良好。但是,对于 1 个 API 调用,我需要利用 Python 微处理模块。
这是那个API方法
jobs = []
queue = Queue()
for idx, val in enumerate(myArray):
process = pool(target=self.getEachNode,
args=(val['ip'], self.subscriberId, queue))
jobs.append(process)
try:
print('waiting for someone to inqueue')
result = queue.get(timeout=120)
print('finally someone inqueued..................')
print(result)
except Exception as ex:
print('Exception occurred while waiting for queue')
# terminate all jobs
for j in jobs:
j.terminate()
for j in jobs:
j.join()
myArray 将有 10 个项目。所以这个请求会运行 10 次。
每当发生这种情况时,python 控制台都会告诉我已经启动了一个新应用程序(因为再次运行以下代码)
if __name__ == "__main__":
app.wsgi_app = DispatcherMiddleware(
app.wsgi_app, {getenv("API_BASEURL", "/api"): app})
socketio.run(app, host='0.0.0.0', debug=False,
port=5100, use_reloader=False)
print('python server running on port 5100')
现在实际发生的是,当这些进程运行时,主应用程序挂起。我无法访问任何其他 API 方法。它基本上是阻塞的。这也会导致套接字断开连接,因为服务器被我的理解阻止了。
我想要的只是让这 10 个任务异步执行。我应该为此使用Pool吗?
Pool 有一个apply_async方法,有帮助吗?
另外,我只想要 1 个响应,我不需要全部完成(不需要 Promise.all)。
顺便说一句,我不能使用任何 Python 3 功能。
解决方案
我最终使用了 Celery / Message Queue,它允许我们在 Flask 中轻松管理异步任务。
推荐阅读
- wordpress - WooCommerce:显示变化价格而不是 [产品] 短代码内的范围
- perl - fetchrow_hashref 是否返回默认值?
- javascript - 用文本 JavaScript 替换字符串中数组的内容
- python - Flask SQLAlchemy 和蓝图
- reactjs - 从与活动存储导轨 api 反应的图像上传
- reactjs - 需要将复选框更改为 Radio -React js
- python - 重排后的Printing_Alice的图书馆
- python - Locust 在暂时收到错误 500 后停止
- angularjs - 如何从凉亭组件转移到节点模块
- python - 在模型编译之前/之后使用“conv_base.trainable = False”的模型差异