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

2024-04-28 10:45:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图执行从websocket客户机到服务器的恒定消息(python/flask/socketio)

我有一个简单的页面上的提交按钮,开始一个长期运行的工作。在

$('form#emit').submit(function(event) {
            socket.emit('submit', {...});
            return false;

在python代码中,我开始执行长时间运行的作业,如下所示:

^{pr2}$

我期望的是python启动长时间运行的\u job_代码,然后以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发出在长时间运行的作业进行时停止。在

有人知道怎么避开这个问题吗?在

谢谢!在


Tags: 代码功能服务器客户机作业functionsocketping
1条回答
网友
1楼 · 发布于 2024-04-28 10:45:40

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

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

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

eventlet.sleep(0)

另一种不阻塞的方法是将long函数放在一个子进程中,这可能需要更多的更改,而只是在这里或那里添加睡眠。在

希望这有帮助!在

相关问题 更多 >