Python Tornado Websocket 连接关闭后仍然打开

2023-12-24

我有一个 Tornado Websocket 服务器,我想在 30 分钟不活动后超时。我用self.close()30 分钟不活动后关闭连接。但似乎有些连接即使在关闭后仍保持打开状态。

这是代码的基本部分(从这里获得帮助后实现:如何在 Tornado Websocket 中的一定时间后自动关闭服务器端连接 https://stackoverflow.com/questions/31289829/tornado-websocket-how-to-automatically-close-connection-serverside-after-a-certa):

打开连接:

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def open(self, *args):
        self.id = self.generate_id()
        self.stream.set_nodelay(True)
        # ... DO STUFF ...
        self.ini_time = datetime.now()
        self.message_number = 0
        self.last_message_time = self.ini_time
        self.write_message("Connection SUCCESSFUL! Thanks for connecting! Your connection ID is: %d :)" % self.id)
        self.timeout = tornado.ioloop.IOLoop.current().add_timeout(timedelta(minutes=30), self.force_close)
        print datetime.now()
        print "New connection. ID: %d" % self.id
        print "Total number of open connections: %d" % len(clients)

收到消息时:

    def on_message(self, message):        
        """
        when we receive some message we want some message handler..
        for this example i will just print message to console
        """
        if self.timeout:
            tornado.ioloop.IOLoop.current().remove_timeout(self.timeout)
        self.timeout = tornado.ioloop.IOLoop.current().add_timeout(timedelta(minutes=30), self.force_close)
        self.last_message_time = datetime.now()
        self.message_number+=1

        print datetime.now()
        print "Client %s sent message : %s" % (self.id, message)
        # ... DO STUFF ...

关闭时:

def on_close(self):
    self.common_close()

def common_close(self):
    print datetime.now()
    print "Open connections are:"
    print clients.keys()
    print "Closing connection %d." % self.id 

    end = datetime.now()
    timeonline = end - self.ini_time
    timeconlastmsg = self.last_message_time - self.ini_time
    print "Total time online:"
    print timeonline
    print "Time between connection start and last message received:"
    print timeconlastmsg
    if self.id in clients.keys():
        del clients[self.id]
    print "Number of open connections: %d" % len(clients)
    print "Open connections are:"
    print clients.keys()

超时时:

def force_close(self):
    timout =  datetime.now()
    print timout
    print "Connection %d timed out, server is dropping the connection." % self.id
    self.common_close()
    self.close() 

超时有效,并且功能force_close被叫。但似乎即使在被调用并删除连接之后clients连接仍处于打开状态且处于活动状态。

以下是该程序的输出示例:

New connection. ID: 66919
Total number of open connections: 3
2015-07-14 21:51:48.387892
New connection. ID: 12012
Total number of open connections: 4
2015-07-14 21:51:48.641603
Open connections are:
[66919, 12012, 11281, 97458]
Closing connection 66919.
Total time online:
0:00:00.404316
Time between connection start and last message received:
0:00:00
Number of open connections: 3
Open connections are:
[12012, 11281, 97458]
... ...
Number of open connections: 4
Open connections are:
[66246, 12012, 97458, 6069]
2015-07-14 22:21:47.906129
Connection 97458 timed out, server is dropping the connection.
2015-07-14 22:21:47.906167
Open connections are:
[66246, 12012, 97458, 6069]
Closing connection 97458.
Total time online:
0:30:00.000450
Time between connection start and last message received:
0:00:00
Number of open connections: 3
Open connections are:
[66246, 12012, 6069]
2015-07-14 22:21:48.237407
Connection 66919 timed out, server is dropping the connection.
2015-07-14 22:21:48.237444
Open connections are:
[66246, 12012, 6069]
Closing connection 66919.
Total time online:
0:30:00.000143
Time between connection start and last message received:
0:00:00
Number of open connections: 3

可以看到,66919被“关闭”了两次,间隔时间为30分钟。有任何想法吗?

另一个例子是,当没有更多打开的连接时,连接 3358 被关闭(再次关闭两次,间隔 30 分钟):

Open connections are:
[7046, 16287]
2015-07-15 11:01:13.604125
New connection. ID: 3358
Total number of open connections: 3
2015-07-15 11:01:28.429574
Open connections are:
[7046, 3358, 16287]
Closing connection 3358.
Total time online:
0:00:14.825568
Time between connection start and last message received:
0:00:00
Number of open connections: 2
Open connections are:
[7046, 16287]
--
Open connections are:
[]
2015-07-15 11:31:13.629530
Connection 3358 timed out, server is dropping the connection.
2015-07-15 11:31:13.629586
Open connections are:
[]
Closing connection 3358.
Total time online:
0:30:00.025556
Time between connection start and last message received:
0:00:00
Number of open connections: 0
Open connections are:
[]

有些人指出我不应该打电话common_close in force_close因为on_close将被调用self.close(), but on_close()没有接到电话self.close().


common_close被调用两次,但连接仅超时一次。在您的第一个示例中,66919 在 21:51 关闭,因为客户端干净地关闭了连接(通过on_close),然后由于超时,在 22:21 再次进行。即使连接对象关闭后,它仍然继续存在。连接未打开;只有超时保持活动状态。您需要删除超时on_close (or common_close) 如果它处于活动状态。

您还应该开始第一次超时open()而不是等待on_message(), and force_close()应该设置self.timeout没有。

自龙卷风 4.1 起on_close()将被调用self.close().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Tornado Websocket 连接关闭后仍然打开 的相关文章

  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • python 中的 <> 运算符有什么作用?

    我刚刚遇到这个here http www feedparser org feedparser py 总是这样使用 if string1 find string2 lt gt 1 pass 什么是 lt gt 运算符这样做 为什么不使用通常的
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • 两个不同长度的数据帧的列之间的余弦相似度?

    我在 df1 中有文本列 在 df2 中有文本列 df2 的长度将与 df1 的长度不同 我想计算 df1 text 中每个条目与 df2 text 中每个条目的余弦相似度 并为每场比赛给出分数 输入样本 df1 mahesh suresh
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • pandas 中数据帧中的随机/洗牌行

    我目前正在尝试找到一种方法来按行随机化数据框中的项目 我在 pandas 中按列洗牌 排列找到了这个线程 在 pandas 中对 DataFrame 进行改组 排列 https stackoverflow com questions 157
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome

随机推荐

  • 您认为软件公司应该向开发人员强加一种编码风格吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 未指定所需属性“action”

    首先 我对我的英语不好感到抱歉 因为我不是以英语为母语的人 所以我的问题中可能存在一些与英语相关的错误 我希望任何读我问题的人都能理解我想说的 我是学习者 我正在将 PSD 转换为 XHTML 和 CSS 我已经完成了我的工作 但是当我在
  • 有没有深入的 ttk 造型指南? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 所以我最近开始涉足 Tkinter 并且我的想法是创建一个本质上讲故事的应用程序 最终 我希望对大多数
  • 使用 tshark 过滤 VoIP 呼叫

    我正在分析网络上的 VoIP 呼叫 目前我正在使用生成的 pcap 文件 但稍后我将实时监听该文件 我正在使用 tshark 我可以很容易地从 pcap 中过滤一些重要数据 例如 源 ip 地址和端口 目标 ip 地址和端口 有效负载 pc
  • 为 CLR 实现函数式语言(或者,关于 F# 实现的论文)

    有谁知道有关 F 编译器实现的任何好论文吗 我正在尝试为针对 CLR 的简单函数式语言生成 CIL 代码 但我在几个方面遇到了困难 函数式语言和 CIL 之间的差异使得生成类型正确的 CIL 代码变得困难 我有通过类型擦除来工作的解决方案
  • Crashlytics 上传 Android 原生库的符号成功,但 Firebase 控制台中没有显示任何符号?

    我正在尝试在 Android 应用程序中上传外部本机库的本机符号 所有设置和 crashlyticsUploadSymbolsRelease 似乎都成功了 我检查了 crashlytics log 它说 cSYM 文件正在生成并上传到htt
  • Azure 应用服务:使用性能计数器

    我正在尝试设置我的 Azure Web 应用程序以包含第三方软件的使用 这似乎需要访问 PerformanceCounters 在本地 这工作正常 但是当我在 Azure 中运行它时 出现以下错误 UnauthorizedAccessExc
  • 如何在python中读取pdf文件而不在unix中转换它? [复制]

    这个问题在这里已经有答案了 pdfile open tutorial pdf r xyz pdfile readlines pqr pdfile readline for a in xyz print a 该代码不显示实际内容 相反 它显示
  • 在准备好的语句上使用 fetch_assoc

    我目前正在编写登录脚本 我得到了以下代码 selectUser db gt prepare SELECT id password salt FROM users WHERE username selectUser gt bind param
  • git 网站更新策略 - 如何同步开发和实时存储库?

    以下是我构建 git 支持的网站更新和备份策略的方式 我可以通过 SSH 访问托管该网站的 Linux VPS 这是我所做的 1 在网站服务器上 在正确的网站文件夹 公共根之前的一级 创建了一个 git 存储库 cd path to web
  • Powershell复制文件或获取内容而不锁定它

    我们有一些预定的脚本 他们必须访问带有点源函数的文件 Functions ps1 此 Functions ps1 位于共享上 因为 ExecutionPolicy 我无法像这样加载文件 share folder Functions ps1
  • 使用 NSTimer 显示像汽油泵表一样动画的秒表计时器

    我是iOS开发新手 当我按下秒表开始按钮时 我想显示计时器 如计数器令牌效果 我附上了图像供您参考 我已经完成了显示秒和分钟 但我不知道 如何动画自动滚动效果 我怎样才能做到这一点 When the counter is moving it
  • Swift DidSelectRowAt 未触发

    我有一个项目 有几个不同的 VC 其中两个有 TableViews 第一个工作得很好 我在那里有一个自定义视图等 第二个也是自定义的 它填充了很好的信息 但与第一个不同 我无法点击它来继续下一个 VC 我已正确设置委托和数据源 我的项目中有
  • 在 ASP.NET 开发服务器下运行时,WebForms 中的 ASP.NET 路由不处理非 ASP 扩展

    我在 Visual Studio 2010 下创建了一个默认网站 在 Global asax 中添加了一个简单的路由 routes MapPageRoute AboutRoute about About aspx 当我启动时显示404ASP
  • glGenerateMipmap - 非 2 的幂

    环境 Ubuntu 17 04 Chrome 60 在本地运行此示例 不会出现警告 错误 https github com mdn webgl examples tree gh pages tutorial sample6 https gi
  • 如何使用 Google Cast SDK 3 添加自定义 SessionProvider

    我们最近将 Google Cast SDK 更新至版本 3 使用此 SDK 应该可以通过在期权提供者 https developers google com android reference com google android gms
  • 批量插入到特定列?

    我想将 csv 文件的列批量插入到目标表的特定列 描述 目标表的列数比我的 csv 文件多 因此 我希望使用 BULK INSERT 将 csv 文件列转到正确的目标列 这可能吗 如果是 那么我该怎么做 我在 上看到了教程和代码http b
  • 在 Unix 中如何找到当前日期减去 7 天?

    我正在尝试查找今天 7 天前的日期 CURRENT DT date F T diff CURRENT DT 7 echo diff 我正在尝试类似上述的方法来查找距离当前日期还少的 7 天 有人可以帮我吗 GNU date将为您计算数学 d
  • 如何使 UIView 动画过渡反向卷曲?

    我正在开发允许在某些情况下翻转界面的应用程序 应支持两种横向方向 横向左和右 设备翻转和方向更改工作正常 但是 在横向模式下 应用程序允许使用 UIViewAnimationTransitionCurlUp 效果转到另一个屏幕 然后使用 U
  • Python Tornado Websocket 连接关闭后仍然打开

    我有一个 Tornado Websocket 服务器 我想在 30 分钟不活动后超时 我用self close 30 分钟不活动后关闭连接 但似乎有些连接即使在关闭后仍保持打开状态 这是代码的基本部分 从这里获得帮助后实现 如何在 Torn