Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Gevent SocketIO内存泄漏断开连接未触发_Python_Socket.io_Gevent - Fatal编程技术网

Python Gevent SocketIO内存泄漏断开连接未触发

Python Gevent SocketIO内存泄漏断开连接未触发,python,socket.io,gevent,Python,Socket.io,Gevent,我已经为此挣扎了好几个小时了。这是一个相当简单的应用程序,类似于基本聊天,只是服务器只向客户端发送消息。我的问题的基础是内存泄漏。我尝试将应用程序重新分解为更无状态的。我一直在跟踪内存泄漏。我看不懂这些图表。我以后可能会更深入。首先,我注意到断开装置没有点火,它确实做了一些清理工作,比如杀死绿孩子为什么断开连接没有触发?如果有人能给我一些见解,我将不胜感激 来自gevent导入猴子的;猴子 导入gevent 导入redis 导入json 进口PHP系列化 从socketio导入socketio

我已经为此挣扎了好几个小时了。这是一个相当简单的应用程序,类似于基本聊天,只是服务器只向客户端发送消息。我的问题的基础是内存泄漏。我尝试将应用程序重新分解为更无状态的。我一直在跟踪内存泄漏。我看不懂这些图表。我以后可能会更深入。首先,我注意到断开装置没有点火,它确实做了一些清理工作,比如杀死绿孩子为什么断开连接没有触发?如果有人能给我一些见解,我将不胜感激

来自gevent导入猴子的
;猴子
导入gevent
导入redis
导入json
进口PHP系列化
从socketio导入socketio_管理
从socketio.server导入SocketIOServer
从socketio.namespace导入BaseNamespace
从socketio.mixin导入广播mixin,RoomsMixin
r=redis.StrictRedis(host='localhost',port=6379)
类ShoutsNamespace(BaseNamespace):
def监听器(自身、房间):
r=redis.StrictRedis()
r=r.pubsub()
r、 预订(房间)
对于r中的m,请听()
如果m['type']=='message':
data=json.load(m['data'])
发出(“喊叫”,数据)
def初始化(自):
打印“已连接”
def on_连接(自身、房间):
self.emit(“shouts”,json.load(r.hget('ffxi.shouts',room)))
self.spawn(self.listener,'ffxi.shouts:'+room)
返回真值
def recv_断开(自):
打印“断开连接”
self.disconnect(静默=真)
类名称空间(BaseNamespace):
def on_ping(自我,信息):
打印消息
类应用程序(对象):
定义初始化(自):
self.buffer=[]
定义呼叫(自我、环境、启动响应):
path=environ['path_INFO'].strip('/'))
如果path.startswith('static/'):
尝试:
数据=打开(路径).read()
除例外情况外:
未找到返回(启动响应)
如果路径.endswith(“.js”):
content\u type=“text/javascript”
elif path.endswith(“.css”):
content\u type=“text/css”
elif path.endswith(“.swf”):
content\u type=“应用程序/x-shockwave-flash”
其他:
content\u type=“text/html”
开始响应('200 OK',[('Content-Type',Content-Type)])
返回[数据]
如果path.startswith(“socket.io”):
socketio_manage(环境,{'/ping':PingNamespace,/shouts':shoutsnespace})
其他:
未找到返回(启动响应)
未找到def(启动响应):
启动\u响应('404未找到',[]))
返回['notfound']
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
SocketIOServer(('216.144.246.171',443),Application(),resource=“socket.io”,policy_server=False,transports=['xhr-polling'])。永远服务()

recv\u disconnect由用户而不是服务器触发。您必须让用户断开连接(添加链接或按钮?),或者使用“beforeunload”或“unload”之类的事件来调用它。在这两种情况下,都需要调用socket.disconnect()

例如:

$(window).on('beforeunload',function(){socket.disconnect();});
希望这对你有所帮助

致以最良好的祝愿


Andreas

我觉得socketio服务器没有断开连接回调似乎很奇怪。您可以检查套接字以查看仍在连接的内容。如果客户端崩溃或由于其他原因无法发送断开连接信号,如何清理资源?
$(window).on('beforeunload',function(){socket.disconnect();});