我有一个 Flask Web 服务,它必须在后台执行长时间的异步操作,并且需要在完成时通知客户端。
为此,我使用dramatiq
运行异步任务并flask_socketio
使用 websockets 通知客户端。
我的代码如下所示:
import dramatiq
from flask import Flask, jsonify, render_template, request, redirect
from flask_socketio import SocketIO, emit
from engineio.payload import Payload
Payload.max_decode_packets = 500
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
async_mode = "eventlet"
socketio = SocketIO(app, async_mode=async_mode)
@app.route('/')
def index():
return render_template('document.html', async_mode=socketio.async_mode)
@app.route('/', methods=['POST'])
def test():
socketio.emit('my_response', {'data': 'First emit'}, namespace='/test')
act.send()
return { "result": "success" }
@dramatiq.actor
def act():
# some long operation goes in here
socketio.emit('my_response', {'data': 'Second Emit'}, namespace='/test')
if __name__ == '__main__':
socketio.run(app, debug=True)
第一个发射有效,第二个无效。考虑到第二次发射实际上是由工作人员在单独的进程中执行的,这不足为奇。
如何修改我的代码以使其正常工作?我想了想也试过了callbacks
,但他们也是actors
,所以有什么不同......还有其他想法吗?