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

时间:2018-03-06 12:40:54

标签: python flask websocket socket.io flask-socketio

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

这有效:

@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秒案例: enter image description here

失败120秒案例:

enter image description here

1 个答案:

答案 0 :(得分:3)

SocketIO的ping_timeout参数默认值为60秒。你可以用它来调整等待时间。

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

考虑以下任何实施方法:

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