A(很久以前)我写了一个多线程的网络蜘蛛,以使并发请求能够同时发生。那是在我的 Python 青年时代,在我了解GIL及其为多线程代码(IE,大多数时候东西只是序列化!)造成的相关问题之前的日子......
我想重新编写此代码以使其更健壮且性能更好。基本上有两种方法可以做到这一点:我可以使用 2.6+ 中的新多处理模块,或者我可以使用某种基于反应器/事件的模型。我宁愿做后者,因为它更简单且不易出错。
因此,问题与哪种框架最适合我的需求有关。以下是我目前所知道的选项列表:
有什么我错过的吗?当然,必须有一个适合简化异步网络库的最佳位置的库!
[编辑:非常感谢intgr指向此页面的指针。如果您滚动到底部,您会看到一个非常好的项目列表,旨在以一种或另一种方式解决此任务。实际上,自从 Twisted 成立以来,事情似乎确实在发生变化:人们现在似乎更喜欢基于协同程序的解决方案,而不是传统的面向反应器/回调的解决方案。这种方法的好处是代码更清晰更直接:我过去肯定发现过,尤其是在使用boost.asio时在 C++ 中,基于回调的代码可能会导致设计难以理解,并且对于未经训练的人来说相对晦涩难懂。使用协同例程可以让你编写至少看起来更同步的代码。我想现在我的任务是找出我喜欢这些库中的哪个外观并试一试!很高兴我现在问…]
[编辑:也许任何关注或偶然发现这个问题或在任何意义上关心这个话题的人都会感兴趣:我发现了一篇关于这项工作的可用工具当前状态的非常好的文章]
我喜欢并发Python 模块,它依赖于 Stackless Python 微线程或 Greenlets 来实现轻量级线程。所有阻塞的网络 I/O 都通过一个libevent循环透明地异步化,因此它应该几乎与真正的异步服务器一样高效。
libevent
我想它在这种方式上类似于 Eventlet。
缺点是它的 API 与 Python 的sockets/threading模块有很大不同;您需要重写相当多的应用程序(或编写兼容性 shim 层)
sockets
threading
编辑: 似乎还有cogen,它是相似的,但使用 Python 2.5 的 增强生成器 作为其协程,而不是 Greenlets。这使得它比并发和其他替代方案更便携。网络 I/O 直接使用 epoll/kqueue/iocp 完成。