【发布时间】:2014-01-04 21:01:01
【问题描述】:
我已经使用这个 Twisted Python TCP 套接字服务器已经有一段时间了,现在我开始真正了解它了。我的问题是我一次有 350 多个(根据日期和时间给予或接受)客户,有时我会有很大的滞后。我所说的延迟是指有时在一个“房间”中(基本上是一个头像聊天,用户有库存、朋友、房子等),有任何数量的用户(通常就像房间里有 10 多个用户一样)通常会有每分钟左右有 2-5 秒“冻结”。冻结我的意思是没有数据包被发送,没有人可以看到任何人移动他们的角色、谈话或任何东西。解冻后,就像所有数据包一次发送一样,您可以看到每个人的消息和内容。
我想知道我可以做些什么来防止延迟。我在考虑多线程,但是我将如何在上面的示例中这样做呢?几周前,我在网上拥有的客户最多的是 451,但我认为这不会很快发生。
如果您对我的问题感到困惑 - 基本上我是在问如何让服务器更好地处理约 350 个客户端并防止房间内所有客户端出现延迟/冻结。
编辑:与那个例子不同,我在底部添加了这个:
ServerCL = GameServer(sys.argv[1])
reactor.listenTCP(int(config.get('GameServer1_' + str(sys.argv[1]), 'port')), ServerCL)
reactor.listenTCP(int(config.get('GameServer2_' + str(sys.argv[1]), 'port')), ServerCL)
reactor.run()
【问题讨论】:
-
我相信twisted在底层已经是多线程的,所以我不确定你会从中得到多少(请随时检查......它已经自从我玩它以来已经有一段时间了)。隔离“为什么”它很慢绝对是正确的方法......
-
twisted 不是线程化的,而是基于事件的。这意味着一切都在同一个线程中运行,如果事件处理程序阻塞或花费太长时间,所有连接都会受到影响。
-
是否有可能不使用 Twisted 作为我的套接字服务器基础会使它变得更好?也许使用普通的套接字库?
-
在不知道原因的情况下,无法预测任何特定更改会产生什么影响。您遇到的问题可能是因为某些代码在某处阻塞了事件循环:在这种情况下,切换到多线程服务器可以 消除问题。另一方面,它的阻塞方式可能仍然会影响多线程服务器。也许问题完全是由其他原因引起的,例如导致垃圾收集器运行很长时间的对象泄漏。切换到多线程服务器无法解决此类问题。
-
最终,如果您想知道 change 究竟是什么fix,您必须了解问题的原因。制作(和分享)一个演示问题的最小示例 (sscce.org>) 将是朝着这个目标迈出的良好一步。
标签: python sockets twisted lag