Python 异常gevent.hub.LoopExit:LoopExit(';此操作将永久阻止';,)

Python 异常gevent.hub.LoopExit:LoopExit(';此操作将永久阻止';,),python,multithreading,flask,socket.io,flask-socketio,Python,Multithreading,Flask,Socket.io,Flask Socketio,在使用Websockets运行Flask应用程序时,我总是遇到此错误。 我试着按照这个指南来做- 我有一个flask应用程序,为我的网络嗅探器提供GUI界面。嗅探器位于一个线程内,如下所示:(l是我的嗅探器的线程;isRunning是一个布尔值,用于检查线程是否已经在运行) 嗅探器在没有socketio的情况下运行良好,我能够在遍历gui时嗅探网络。但是,当我在代码中包含socketio时,我首先看到socketio在我的索引页面中工作,并且我能够接收从服务器到页面的消息。我还可以很好地遍历GU

在使用Websockets运行Flask应用程序时,我总是遇到此错误。 我试着按照这个指南来做-

我有一个flask应用程序,为我的网络嗅探器提供GUI界面。嗅探器位于一个线程内,如下所示:(l是我的嗅探器的线程;isRunning是一个布尔值,用于检查线程是否已经在运行)

嗅探器在没有socketio的情况下运行良好,我能够在遍历gui时嗅探网络。但是,当我在代码中包含socketio时,我首先看到socketio在我的索引页面中工作,并且我能够接收从服务器到页面的消息。我还可以很好地遍历GUI中的其他静态页面;然而,激活我的线程网络嗅探器会使我的浏览器挂断。我总是收到异常gevent.hub.LoopExit:LoopExit('此操作将永远阻止',)错误,当我重新运行程序时,控制台会说该地址已在使用中。在我看来,我可能没有正确地关闭我的插座,因为这正在发生。我还认为一些操作是基于错误阻塞的。我的python flask应用程序中的代码如下所示

def background_thread():
    """Example of how to send server generated events to clients."""
    count = 0
    while True:
        time.sleep(10)
        count += 1
        socketio.emit('my response',{'data': 'Server generated event', 'count': count},namespace='/test')
if socketflag is None:
    thread = Thread(target=background_thread)
    thread.start()


@socketio.on('my event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']})

@socketio.on('my broadcast event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']}, broadcast=True)

@socketio.on('connect', namespace='/test')
def test_connect():
    emit('my response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')
下面是我的索引页中的代码

<script type="text/javascript" charset="utf-8">
        $(document).ready(function() {
            namespace = '/test'; // change to an empty string to use the global namespace

            // the socket.io documentation recommends sending an explicit package upon connection
            // this is specially important when using the global namespace
            var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
            socket.on('connect', function () {
                socket.emit('my event', {data: 'I\'m connected!'});
            });

            // event handler for server sent data
            // the data is displayed in the "Received" section of the page
            socket.on('my response', function (msg) {
                $('#log').append('<br>Received #' + msg.count + ': ' + msg.data);
            });
        });
  </script>

$(文档).ready(函数(){
namespace='/test';//更改为空字符串以使用全局命名空间
//socket.io文档建议在连接时发送显式包
//这在使用全局命名空间时特别重要
var socket=io.connect('http://'+document.domain+':'+location.port+名称空间);
socket.on('connect',function(){
emit('my event',{data:'I'm connected!'});
});
//服务器发送数据的事件处理程序
//数据显示在页面的“已接收”部分
socket.on('my response',函数(msg){
$(“#log”).append(“
已接收的#”+msg.count+”:“+msg.data); }); });
您应该避免将
time.sleep()与gevent一起使用。
您应该改用
gevent.sleep()

time.sleep()
将阻止gevent循环

我前一段时间遇到了这个问题,它是由于没有正确地对
线程
模块进行猴子补丁造成的

在应用程序顶部,应用gevent修补程序:

from gevent import monkey, sleep
monkey.patch_all()


确保GEvent池大小大于1。如果将其设置为1,GEvent在处理事件时将没有任何工作人员可切换,因此将对此进行投诉。

您能否将错误的完整堆栈跟踪添加到问题中?另外,您是否正在使用猴子补丁
线程
from gevent import monkey, sleep
monkey.patch_all()