Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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扭曲套接字服务器_Python_Sockets_Twisted_Lag - Fatal编程技术网

Python扭曲套接字服务器

Python扭曲套接字服务器,python,sockets,twisted,lag,Python,Sockets,Twisted,Lag,我已经使用这个TwistedPythonTCP套接字服务器很长一段时间了,现在我开始真正了解它了。我的问题是,我一次有350多个客户(根据日期和时间而定),有时我会有严重的延迟。所谓延迟,我的意思是,有时在一个“房间”(基本上是一个虚拟聊天室,用户有库存、朋友、房子等)中,任何数量的用户(通常像房间里的10多个用户那样)通常每分钟左右会有2-5秒的“冻结”。我所说的冻结是指没有数据包被发送,也没有人能看到任何人移动他们的角色、说话或任何东西。当它解冻后,就像所有的数据包一次发送,你会看到每个人的

我已经使用这个TwistedPythonTCP套接字服务器很长一段时间了,现在我开始真正了解它了。我的问题是,我一次有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本身的问题,而是应用程序中的问题,它占用了2-5秒的时间,阻止了服务器做其他事情


听起来你有一个大而复杂的应用程序,所以与其猜测它可能是什么,我建议你使用一个工具来识别你的应用程序在哪里卡住了;这应该会让你知道你可以改变什么。

我相信twisted已经是多线程的了,所以我不确定你会从中得到什么(请随时检查……我玩它已经有一段时间了)。隔离“为什么”它慢绝对是正确的方法…twisted不是线程化的,而是基于事件的。这意味着所有东西都在同一个线程中运行,如果事件处理程序阻塞或花费太长时间,所有连接都将受到影响。是否可能不使用Twisted作为套接字服务器基础会使它变得更好?也许使用普通的套接字库?如果不知道原因,就无法预测任何特定的更改会发生什么。也许您遇到的问题是因为某些代码在某处阻塞了事件循环:在这种情况下,切换到多线程服务器可以消除问题。另一方面,它的阻塞方式可能仍然会影响多线程服务器。可能问题完全是由其他原因引起的,比如导致垃圾收集器运行时间过长的对象泄漏。这样的问题不能通过切换到多线程服务器来解决。最终,如果您想知道什么样的更改才是真正的解决方案,您必须了解问题的原因。制作(并共享)一个演示问题的最小示例(谢谢!我一定会研究并尝试它。只是想知道,但是你以前用过它吗?我现在正在使用它,我得到了大量这样的输出:。我正在使用他们github中的默认值:
watcher=HangWatcher(0.1,0.5)watcher.start()
有人有什么想法吗?
输出告诉你的是光标。execute
是阻止你的程序的原因。这并不奇怪!执行一些SQL是阻止对外部系统(你的数据库)的网络请求,这可能非常慢。你需要做非阻塞数据库I/O;看看Twisted的内置
twisted.enterprise.adbapi
adbapi2
来自,或者。谢谢,我现在就来调查一下。