使用Python Flask 2.7的多处理器处理将挂起主应用程序,直到处理完成



我已经设置了一个使用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有一个apply_async的方法,这有帮助吗?

此外,我只想要一个回应,我不需要所有的都完成(不需要承诺。所有(。

顺便说一下,我不能使用Python 3的任何功能。

我最终使用了Celery/Message Queue,它使我们能够轻松地管理Flask中的异步任务。

最新更新