我试图执行从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发出在长时间运行的作业进行时停止。在
有人知道怎么避开这个问题吗?在
谢谢!在
您没有提到这一点,但我猜您正在使用eventlet或gevent作为应用程序的web服务器,因为这是在使用WebSocket和Flask SocketIO时最有意义的。在
Eventlet和gevent是协同程序服务器。他们可以处理多任务,但这是合作完成的。这意味着上下文从一个任务切换到另一个任务,第一个任务必须释放CPU。当进行某些I/O调用时,CPU会自动透明地释放,比如从套接字读写。您还可以通过调用
sleep
函数显式释放CPU。如果一个任务在没有执行任何I/O或显式释放CPU的情况下进行了一些长时间的计算,那么整个过程将被阻塞。在当你运行你的长函数时,你基本上有两种方法来保持机器运转。一种方法是定期发出睡眠电话。当发生睡眠调用时,调度程序将在从睡眠状态返回之前将CPU分配给其他任务。例如,如果函数有一个循环,则可以在每次迭代中添加:
另一种不阻塞的方法是将long函数放在一个子进程中,这可能需要更多的更改,而只是在这里或那里添加睡眠。在
希望这有帮助!在
相关问题 更多 >
编程相关推荐