python - 如何处理端口的突发连接?

标签 python sockets asyncore

我已经使用 Python(异步和套接字)构建了一个监听服务器上特定端口的服务器,我很想知道当我的服务器上同时连接的人太多时是否可以做任何事情。

代码本身无法更改,但是添加更多进程是否有效?或者是从硬件角度来看,我应该专注于在前面添加一个负载均衡器并平衡多个服务器上的请求?

这个问题是 StackOverflow(代码/python)和 ServerFault(服务器管理)的边界。由于代码原因,我决定使用 SO,但如果您认为 ServerFault 更好,请告诉我。

最佳答案

1. asyncore 依赖于操作系统来进行整个连接处理,因此您所要求的内容取决于操作系统。和Python关系不大。使用twisted 而不是asyncore 并不能解决你的问题。 例如,在 Windows 上,您只能监听同时进入的 5 个连接。 因此,第一个要求是在 *nix 平台上运行它。 其余的取决于您的处理程序需要多长时间以及您的带宽。

2. 您可以做的是将异步和线程结合起来以加快等待下一个连接的速度。 IE。您可以使处理程序在单独的线程中运行。这会有点困惑,但这是可能的解决方案之一。 当服务器接受连接时,您可以创建一个处理读取和写入的处理程序,而不是创建新的传统处理程序(这会减慢对后续连接的检查 - 因为 asyncore 会等待该处理程序至少完成一点工作)非阻塞。 IE。它启动一个线程并完成工作,然后,当它准备好数据时,只有在循环()检查后才发送它。 这样,您就可以允许 asyncore.loop() 更频繁地检查服务器的套接字。

3. 或者您可以将两个不同的 socket_map 与两个不同的 asyncore.loop() 一起使用。 您使用一张 map (字典),比如说默认的一张 - asyncore.socket_map 来检查服务器,并使用一张 asyncore.loop(),比如说在主线程中,仅用于 server()。 然后,您使用客户端处理程序的自定义字典在线程中启动第二个 asyncore.loop() 。 因此,一个循环仅检查接受连接的服务器,当它到达时,它会创建一个处理程序,该处理程序位于处理程序的单独映射中,由线程中运行的另一个 asyncore.loop() 检查。 这样,您就不会混合服务器连接检查和客户端处理。因此,服务器在接受一个连接后立即进行检查。另一个循环在客户端之间进行平衡。

如果您决心走得更快,您可以通过为处理程序提供更多映射来利用多处理器计算机。 例如,每个 CPU 一个,以及使用 asyncore.loop() 的多个线程。 请注意,套接字是使用系统调用的 IO 操作,而 select() 也是一种,因此在 asyncore.loop() 等待结果时释放 GIL。这意味着,您将拥有多线程的全部优势,并且每个 CPU 将以真正并行的方式处理其数量的客户端。 您需要做的是让服务器分配负载并在连接到达时启动线程循环。 不要忘记 asyncore.loop() 在 map 清空时结束。因此,管理客户端的线程中的loop()必须在接受新连接时启动,并在某个时间不再存在连接时重新启动。

4. 如果您希望能够在多台计算机上运行服务器并将它们用作集群,那么您可以在前面安装进程平衡器。 如果您正确编写了 asyncore 服务器并且只想在单台计算机上运行它,我认为没有必要这样做。

关于python - 如何处理端口的突发连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47473750/

相关文章:

python - 如何在没有 root 权限的情况下安装 python 3.x 和 2.y

java - 通过 Java TCP 套接字发送任意长的字符串

python - 高效的python聊天服务器

php - 套接字客户端发送消息

mysql - Python 3 MySQL GPS跟踪器数据库插入错误

python - 如何扫描 python smtpd 服务器的文本

python - Lepl 中的 Token() 对象

Python 3 pyplot.hold 已弃用

python - 未绑定(bind)方法错误 - 基于文本的冒险

c++ - 编写第一个监听 C++ 应用程序