当代码执行时间过长时,Flask-SocketIO 连接被中断

Flask-SocketIO connection gets interrupted when code execution takes too long

嗨,一旦代码执行时间过长,我的转换完成就会停止到达客户端。

这个有效:

@socketio.on('nifti_conversion')
def handle_message(message):
    elehelper.send_status({'code': 201, 'message':'conversion started!'})
    sleep(5)
    elehelper.send_status({'code': 202, 'message':'conversion finished!'})

而以下失败:

@socketio.on('nifti_conversion')
def handle_message(message):
    elehelper.send_status({'code': 201, 'message':'conversion started!'})
    sleep(120)
    elehelper.send_status({'code': 202, 'message':'conversion finished!'})

另请注意,这有效:

@socketio.on('nifti_conversion')
def handle_message(message):
    elehelper.send_status({'code': 201, 'message':'conversion started!'})
    socketio.sleep(120)
    elehelper.send_status({'code': 202, 'message':'conversion finished!'})

首先,我预计会出现某种超时,但断开连接发生在不同的时间之后。到目前为止,我观察到 90、94、100、104 秒。

在客户端,控制台如下所示。

工作5秒案例:

失败 120 秒的情况:

SocketIO 有一个 ping_timeout 参数,默认值为 60 秒。你可以玩它来调整等待时间。

但是对于执行任何长操作,建议不要阻塞当前线程,因为它会阻塞下一个请求。

考虑以下任何实施方法:

  1. 使用线程或单独进程的异步执行https://docs.python.org/3/library/concurrent.futures.html
  2. 基于 Celery 的后台任务http://flask.pocoo.org/docs/0.12/patterns/celery
  3. Asyncio 的协程http://flask-aiohttp.readthedocs.io/en/latest/coroutine.html