我已经使用Python(asyncore和套接字)构建了一个监听服务器上特定端口的服务器,我很想知道当我的一次连接太多时,是否有任何可能的事情可做服务器
代码本身无法更改,但会添加更多流程吗?或者是从硬件的角度来看,我应该专注于在前面添加负载均衡器并在多个服务器上平衡请求?
这个问题是边界StackOverflow(代码/ python)和ServerFault(服务器管理)。因为代码我决定使用SO,但如果您认为ServerFault更好,请告诉我。
答案 0 :(得分:2)
1。 asyncore依赖操作系统进行整个连接处理,因此您所要求的是依赖于操作系统。它与Python几乎没有关系。使用twisted而不是asyncore并不能解决您的问题。 例如,在Windows上,您只能同时收听5个连接。 所以,第一个要求是,在* nix平台上运行它。 其余的取决于你的处理人员带走的时间和你的带宽。
2。 你可以做的是结合asyncore和线程来加速等待下一次连接。 即您可以创建在单独的线程中运行的处理程序。它会有点乱,但它是可能的解决方案之一。 当服务器接受连接时,而不是创建新的传统处理程序(这将减慢对后续连接的检查 - 因为asyncore等待该处理程序至少完成其工作的一小部分),您创建一个处理读取和写入的处理程序无阻塞。 即它启动一个线程并完成工作,然后,当它准备好数据时,只有在循环()的检查后发送它。 这样,您允许asyncore.loop()更频繁地检查服务器的套接字。
3。 或者你可以使用两个不同的socket_maps和两个不同的asyncore.loop()。 你使用一个map(字典),比如默认的一个 - asyncore.socket_map来检查服务器,并使用一个asyncore.loop(),比如说在主线程中,只用于server()。 然后在线程中使用自定义字典为客户端处理程序启动第二个asyncore.loop()。 因此,一个循环只检查接受连接的服务器,当它到达时,它会创建一个处理程序,该处理程序位于处理程序的单独映射中,由另一个在线程中运行的asyncore.loop()检查。 这样,您不会混合服务器连接检查和客户端处理。因此,在接受一个连接后立即检查服务器。另一个循环在客户端之间平衡。
如果您决定更快,可以通过为处理程序提供更多地图来利用多处理器计算机。 例如,每个CPU一个,asyncore.loop()s的线程数。 注意,套接字是使用系统调用的IO操作,select()也是一个,因此在asyncore.loop()等待结果时释放GIL。这意味着,您将拥有多线程的全部优势,并且每个CPU将以字面上的并行方式处理其客户端数量。 您需要做的是让服务器分配负载并在连接到达时启动线程循环。 不要忘记,当地图清空时,asyncore.loop()会结束。因此,当接受新连接并重新启动时,必须在管理客户端的线程中启动循环(),如果在某个时间不再存在连接。
4。 如果您希望能够在多台计算机上运行服务器并将其用作群集,则可以在前面安装流程平衡器。 如果您正确编写了asyncore服务器并且只想在单台计算机上运行它,我认为没有必要。