1

我有一个 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,所以有什么不同......还有其他想法吗?

4

0 回答 0