Python 如何绕过阻止其他websocket调用的websocket调用

Python 如何绕过阻止其他websocket调用的websocket调用,python,flask,websocket,socket.io,Python,Flask,Websocket,Socket.io,我正在尝试执行从websocket客户端到服务器的恒定消息(python/flask/socketio) 我在一个简单的页面上有一个提交按钮,可以启动一个长时间运行的作业 $('form#emit').submit(function(event) { socket.emit('submit', {...}); return false; 在python代码中,我启动了长时间运行的工作,如下所示: @socketio.on('submit', na

我正在尝试执行从websocket客户端到服务器的恒定消息(python/flask/socketio)

我在一个简单的页面上有一个提交按钮,可以启动一个长时间运行的作业

$('form#emit').submit(function(event) {
            socket.emit('submit', {...});
            return false;
在python代码中,我启动了长时间运行的工作,如下所示:

@socketio.on('submit', namespace='/namespace')
def long_running_function(message):
    long_running_job_code(message)
我希望python启动长时间运行的作业代码,然后以setInterval的形式返回执行循环:

在客户端“循环”上:

setInterval(function() { pinger() }, 1000);
    function pinger()
    {
       socket.emit('ping','test');
    }
在服务器上:

@socketio.on('ping', namespace='/namespace')
def ping(message):
    emit('my response', {'data': '.'})
在点击提交按钮之前,“ping”功能将。。。。但当长时间运行的作业代码正在执行时,它不会继续执行该功能

我相信问题是服务器端阻塞,但我不确定。长时间运行的作业具有仍然到达客户端的发射,但是ping发射在长时间运行的作业运行时停止

有人知道怎么避开这件事吗


谢谢

您没有提到这一点,但我猜您正在使用eventlet或gevent作为应用程序的web服务器,因为这是在使用WebSocket和Flask SocketIO时最有意义的

Eventlet和gevent是协同路由服务器。他们可以处理多任务,但这是协同完成的。这意味着要从一个任务切换到另一个任务,第一个任务必须释放CPU。当进行某些I/O调用时(如从套接字读取或写入时),CPU会自动透明地释放。您还可以通过调用
sleep
函数显式释放CPU。如果一个任务在没有做任何I/O或显式释放CPU的情况下进行一些长时间的计算,那么整个过程都会阻塞

在运行长期功能时,基本上有两种方法保持机器运转。一种方法是定期拨打睡眠电话。当发生睡眠调用时,调度程序将在从睡眠返回之前将CPU分配给其他任务。例如,如果您的函数有一个循环,您可以在每次迭代中添加:

eventlet.sleep(0)
另一种不阻塞的方法是将long函数放在子进程中,这可能需要更多的更改,而不仅仅是在这里和那里添加sleep


希望这有帮助

你指的是什么循环?我没有看到一个循环。您的问题是在服务器端还是在客户端阻塞?本例中的“循环”是setInterval(函数()…它每1000毫秒发出一次ping在让长时间运行的作业完成后,该作业运行时发出的ping被转储到屏幕上,因此它似乎在后台处理这些ping,直到长时间运行的作业完成。目标是让它同时执行这两项操作。你是对的,我使用的是flask socketIO,这给了我一些帮助我想继续,我可以做更多的实验,看看如何最好地处理它。