【发布时间】:2020-03-29 02:44:15
【问题描述】:
我正在尝试让 Flask-SocketIO 服务器与多处理一起工作。服务器在没有多处理的情况下工作正常。我需要在通过访问路由调用的函数内发出 SocketIO 消息。以前,我通过将 socketio 作为参数传递给函数来做到这一点,然后使用 socketio.emit(),效果很好。不幸的是,当我使用 pool.apply() 将函数添加到池中时,我得到了TypeError: cannot serialize 'greenlet.greenlet' object。如果我不通过套接字,它可以工作,但显然我没有得到我需要的套接字功能。是什么导致了这个错误,我该如何纠正它?我没有使用 gunicorn 或 eventlet 或 gevent 或其他任何东西。
我的简化代码:
def requester(user, socket):
socket.emit('hello')
# do some stuff with requests and databases
socket.emit('goodbye')
def main():
app = Flask(__name__,
static_url_path='',
static_folder='dist',
template_folder='dist')
socketio = SocketIO(app)
pool = multiprocessing.Pool(16)
@app.route('/addname', methods=['POST'])
def add_name:
pool.apply(requester, args=(request.json['user'], socketio))
return request.json['user'], 201
socketio.run(app, host='0.0.0.0', port=8000)
if __name__ == '__main__':
main()
【问题讨论】:
标签: python-multiprocessing flask-socketio