小编典典

一个干净、轻量级的 Python 扭曲替代品?[关闭]

all

A(很久以前)我写了一个多线程的网络蜘蛛,以使并发请求能够同时发生。那是在我的 Python
青年时代,在我了解GIL及其为多线程代码(IE,大多数时候东西只是序列化!)造成的相关问题之前的日子......

我想重新编写此代码以使其更健壮且性能更好。基本上有两种方法可以做到这一点:我可以使用 2.6+
中的新多处理模块,或者我可以使用某种基于反应器/事件的模型。我宁愿做后者,因为它更简单且不易出错。

因此,问题与哪种框架最适合我的需求有关。以下是我目前所知道的选项列表:

  • Twisted:Python 反应器框架的鼻祖:看起来很复杂而且有点臃肿。小任务的陡峭学习曲线。
  • Eventlet:来自lindenlab的人。面向此类任务的基于 Greenlet 的框架。不过我看了一下代码,它不太漂亮:不符合 pep8,散布着打印(为什么人们在框架中这样做!?),API 似乎有点不一致。
  • PyEv:不成熟,现在似乎没有人在使用它,虽然它基于 libevent,所以它有一个可靠的后端。
  • asyncore : 来自 stdlib: uber 低级,似乎需要大量的跑腿工作才能使某些东西脱离实际。
  • tornado:虽然这是一个面向服务器的产品,旨在为动态网站提供服务,但它确实具有异步 HTTP 客户端和简单的ioloop。看起来它可以完成工作,但不是它的预期目的。[编辑:不幸的是,它不能在 Windows 上运行,这对我来说很重要——我需要支持这个蹩脚的平台]

有什么我错过的吗?当然,必须有一个适合简化异步网络库的最佳位置的库!

[编辑:非常感谢intgr指向此页面的指针。如果您滚动到底部,您会看到一个非常好的项目列表,旨在以一种或另一种方式解决此任务。实际上,自从
Twisted
成立以来,事情似乎确实在发生变化:人们现在似乎更喜欢基于协同程序的解决方案,而不是传统的面向反应器/回调的解决方案。这种方法的好处是代码更清晰更直接:我过去肯定发现过,尤其是在使用boost.asio时
C++
中,基于回调的代码可能会导致设计难以理解,并且对于未经训练的人来说相对晦涩难懂。使用协同例程可以让你编写至少看起来更同步的代码。我想现在我的任务是找出我喜欢这些库中的哪个外观并试一试!很高兴我现在问…]

[编辑:也许任何关注或偶然发现这个问题或在任何意义上关心这个话题的人都会感兴趣:我发现了一篇关于这项工作的可用工具当前状态的非常好的文章]


阅读 65

收藏
2022-06-10

共1个答案

小编典典

我喜欢并发Python 模块,它依赖于 Stackless
Python 微线程或 Greenlets 来实现轻量级线程。所有阻塞的网络 I/O
都通过一个libevent循环透明地异步化,因此它应该几乎与真正的异步服务器一样高效。

我想它在这种方式上类似于 Eventlet。

缺点是它的 API 与 Python 的sockets/threading模块有很大不同;您需要重写相当多的应用程序(或编写兼容性 shim 层)

编辑: 似乎还有cogen,它是相似的,但使用 Python 2.5 的
增强生成器 作为其协程,而不是 Greenlets。这使得它比并发和其他替代方案更便携。网络 I/O 直接使用 epoll/kqueue/iocp
完成。

2022-06-10