- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个必须支持客户端-服务器连接的应用程序。为此,我使用了允许我创建 WebSocket 的 tornado 模块。我打算始终处于运行状态,至少在服务器端。所以我非常担心在这些连接上创建的每个对象的性能和内存使用情况。我已经开始进行测试以检测这些对象实际上何时被库消除了。以示例代码为例,我重写了方法 __del__()
服务器.py
#! /usr/bin/env python
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import gc, sys
import resource
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
print 'new connection'
self.write_message("h")
def check_origin(self, origin):
return True
def on_message(self, message):
print "Message: " + message
def on_close(self):
print 'Closed'
print 'GC count: ' + str(len(gc.get_referrers(self)))
def __del__(self):
print "DELETED"
application = tornado.web.Application([
(r'/s', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
客户端.py
#! /usr/bin/env python
from ws4py.client.tornadoclient import TornadoWebSocketClient
from tornado import ioloop
class MainClient(TornadoWebSocketClient):
def opened(self):
print "Connected"
def received_message(self, message):
print "Message"
#I close the connection
self.close()
def closed(self, code, reason=None):
print "Closed"
ioloop.IOLoop.instance().stop()
def __del__(self):
print "DELETED"
if __name__ == "__main__":
ws = MainClient('ws://localhost:8888/s', protocols=['http-only', 'chat'])
ws.connect()
ioloop.IOLoop.instance().start()
当客户端收到消息时,它会关闭连接。我希望这两个对象都被消除,因为连接已关闭,所以调用了 __del__()
方法,但那并没有发生。
服务器输出:
new connection
Closed
GC count: 6
客户端输出:
Connected
Message
Closed
如您所见,它没有打印出我期望从 __del__()
方法中得到的 DELETED
语句。
--已编辑--
此外,我还添加了一行打印在关闭连接时具有该对象的 GC 的引用数。这证明确实存在引用循环。
-----
显然,我将使用的类会比那些更复杂,但可以帮助我理解这两个对象的行为,这是我真正想知道的:它们何时被删除?删除它们时会释放内存吗?或者以其他方式成为某种方式?或者“如何显式删除对象?”
我阅读了tornado.websocket.WebSocketHandler
documentation ,它向我解释对象何时“关闭”,但我不知道何时释放内存。
最佳答案
WebSocket 代码目前包含一些引用循环,这意味着直到下一次完整 GC 才会清理对象。更糟糕的是,__del__
方法实际上可以阻止对象的删除(在 python 3.3 和更早版本中:https://docs.python.org/3.3/library/gc.html#gc.garbage),因此很难判断什么时候真正被删除了。相反,您只需要对系统进行负载测试,看看它的内存占用量是否会随着时间的推移而增加。
(欢迎在连接关闭后打断引用循环的补丁)
关于python - WebSocketHandler 和 TornadoWebSocketClient 何时完全删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30806485/
我想做的是拥有一个对象(它是一个在单独线程中运行的 gstreamer 进程),以便能够调用 WebSocketHandler 的 write_message() 函数 这是我目前拥有的一段代码 ap
在 python 方面,我创建了一个 WebSocketHandler。 from tornado import gen from tornado.escape import json_decode
我正在使用 Jetty 9 设置 WebSocket 处理程序。我见过使用 WebSocketHandler 或 WebSocketServlet 的示例。 这就是我正在做的事情: public cl
我正在开发一个必须支持客户端-服务器连接的应用程序。为此,我使用了允许我创建 WebSocket 的 tornado 模块。我打算始终处于运行状态,至少在服务器端。所以我非常担心在这些连接上创建的每个
我正在尝试传递 my_object 的实例作为初始化 WebSocketHandler 时的参数Tornado 中的实例,因此我可以在通信期间使用它。我尝试执行以下操作,但没有成功。 class WS
我在为通过 PerConnectionWebSocketHandler 使用的实现 WebSocketHandler 的类进行简单属性注入(inject)时遇到问题。 这个示例在没有 @Value 注
我有一个像这样初始化的 Tornado HTTPServer: ssl_options = { "certfile": "mycert.crt", "keyfile": "mykey.
我正在使用 Microsoft.Web.WebSockets对于一个应用程序。 我有一个用户集合WebSocketCollection group;我需要向除了一个人之外的所有人发送消息 group
是否可以同时运行 WebSocketHandler 和 WebAppContext?我使用的是最新版本 9.2.1.v20140609。我尝试了下面的配置,但是在 Websocket 调用 local
本文整理了Java中org.springframework.web.socket.WebSocketHandler.supportsPartialMessages()方法的一些代码示例,展示了WebS
本文整理了Java中org.springframework.web.socket.WebSocketHandler.handleMessage()方法的一些代码示例,展示了WebSocketHandl
本文整理了Java中org.springframework.web.socket.WebSocketHandler.afterConnectionEstablished()方法的一些代码示例,展示了W
本文整理了Java中org.springframework.web.socket.WebSocketHandler.afterConnectionClosed()方法的一些代码示例,展示了WebSoc
本文整理了Java中org.springframework.web.socket.WebSocketHandler.handleTransportError()方法的一些代码示例,展示了WebSock
通过以下两个最小示例应该可以重现该问题: 使用 app.run() 的最小示例 from flask import Flask app = Flask(__name__) @app.route('/'
我是一名优秀的程序员,十分优秀!