У меня есть приложение Flask, которое при определенном вызове отдыха запускает несколько модулей с использованием ProcessPoolExecutor.
ОБНОВЛЕНО: добавлен Redis в качестве очереди сообщений (с использованием Docker, Redis в качестве хоста Redis)
socketio = SocketIO(app, message_queue='redis://redis')
(...)
def emit_event(evt, message):
socketio.emit(evt, message, namespace='/test')
@app.route('/info', methods=['GET'])
def info():
emit_event('update_reports', '')
(...)
if __name__ == "__main__":
socketio.run(host='0.0.0.0', threaded=True)
Теперь, когда я добавил Redis, он по-прежнему работает при отправке из основного приложения. Вот некоторые из кода, в котором я запускаю подпроцесс:
def __init__(self):
self.executor = futures.ProcessPoolExecutor(max_workers=4)
self.socketio = SocketIO(async_mode='eventlet', message_queue='redis://redis')
(...)
future = self.executor.submit(process, params)
future.add_done_callback(functools.partial(self.finished_callback, pid))
Затем в этом обратном вызове я вызываю метод emit_event
:
def finished_callback(self, pid, future):
pid.status = Status.DONE.value
pid.finished_at = datetime.datetime.utcnow
pid.save()
self.socketio.emit('update_reports', 'done', namespace='/test')
Получение и отправка/отправка сообщений от/к клиенту с моего контроллера работает нормально, также, если я вызываю /info из curl или postman, мой клиент получает сообщение, но при попытке отправить событие таким же образом из этого обратного вызова подпроцесса, теперь он показывает эту ошибку:
Это в основном для уведомлений, таких как уведомление о завершении длительного процесса и тому подобное.
INFO:socketio:emitting event "update_reports" to all [/test]
ERROR:socketio:Cannot publish to redis... retrying
ERROR:socketio:Cannot publish to redis... giving up
Что я делаю неправильно?
Спасибо!
/info
, но в вашем примере есть/test
. Я предполагаю, что это маршрут, который вы вызываете из завитка? - person Miguel   schedule 31.08.2018emit_event
из основного файла py, в котором он находится, и использую его так же, как я использую его в этом вызове/test
. Да, это URL, который я вызываю. И в результате из подпроцесса никогда не приходит событие/сообщение (и в консоли нет ошибки) - person magnoz   schedule 02.09.2018