gpt4 book ai didi

python - 用 Python 编写基于套接字的服务器,推荐策略?

转载 作者:太空狗 更新时间:2023-10-29 20:10:14 25 4
gpt4 key购买 nike

我最近在读 this document其中列出了一些可用于实现套接字服务器的策略。即,它们是:

  1. 每个线程为多个客户端提供服务,并使用非阻塞 I/O 和级别触发的就绪通知
  2. 使用每个线程为多个客户端提供服务,并使用非阻塞 I/O 和就绪更改通知
  3. 使用每个服务器线程为多个客户端提供服务,并使用异步 I/O
  4. 使用每个服务器线程为一个客户端提供服务,并使用阻塞 I/O
  5. 将服务器代码构建到内核中

现在,我将很感激关于应该在 CPython 中使用哪个的提示,我们知道它有一些优点,也有一些缺点。我最感兴趣的是高并发下的性能,是的,目前的一些实现太慢了。

因此,如果我可以从简单的开始,“5”已经过时了,因为我不会将任何东西侵入内核。

"4"看起来也一定是因为 GIL 的缘故。当然,您可以在这里使用多处理代替线程,这确实会带来显着的提升。阻塞 IO 还具有更易于理解的优势。

这里我的知识有点减少:

“1”是传统的选择或轮询,可以简单地与多处理结合。

“2”是就绪变化通知,由较新的epoll和kqueue使用

“3”我不确定是否有任何具有 Python 包装器的内核实现。

所以,在 Python 中,我们有很多很棒的工具,比如 Twisted。也许它们是更好的方法,尽管我对 Twisted 进行了基准测试,发现它在多处理器机器上太慢了。也许有 4 个带负载平衡器的双绞线可以做到这一点,我不知道。任何建议将不胜感激。

最佳答案

asyncore基本上是“1”——它在内部使用 select,你只有一个线程处理所有请求。根据文档,它还可以使用 poll。 (编辑:删除了 Twisted 引用,我认为它使用了 asyncore,但我错了)。

“2”可以用 python-epoll 实现(只是用谷歌搜索 - 以前从未见过)。编辑:(来自评论)在 python 2.6 中 select module具有 epoll、kqueue 和 kevent 内置(在支持的平台上)。因此,您不需要任何外部库来执行边缘触发服务。

不要排除“4”,因为 GIL 将在线程实际执行或等待 IO 操作时被丢弃(大多数情况下可能如此)。当然,如果您拥有大量连接,那将毫无意义。如果您有很多处理工作要做,那么 python 可能对这些方案中的任何一个都没有意义。

为了灵 active ,可以查看 Twisted

实际上,您的问题归结为您要对请求进行多少处理。如果你有很多处理,并且需要利用多核并行操作,那么你可能需要多个进程。另一方面,如果您只需要监听大量连接,那么使用少量线程的 select 或 epoll 应该可以。

关于python - 用 Python 编写基于套接字的服务器,推荐策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/634107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com