一个干净、轻量级的Python替代品';什么是扭曲的?
很久以前,我编写了一个WebSpider,我对它进行了多线程处理,以使并发请求能够同时发生。那是在我年轻的Python时代,在我了解Python及其为多线程代码带来的麻烦之前的日子里(也就是说,大多数情况下,这些东西最终都被序列化了!) 我想重新编写这段代码,使它更健壮,性能更好。基本上有两种方法可以做到这一点:我可以使用2.6+中的新版本,或者我可以使用某种基于反应器/事件的模型。我宁愿以后做,因为它更简单,更不容易出错 所以问题是什么样的框架最适合我的需要。以下是到目前为止我所知道的选项列表:一个干净、轻量级的Python替代品';什么是扭曲的?,python,networking,twisted,asynchronous,Python,Networking,Twisted,Asynchronous,很久以前,我编写了一个WebSpider,我对它进行了多线程处理,以使并发请求能够同时发生。那是在我年轻的Python时代,在我了解Python及其为多线程代码带来的麻烦之前的日子里(也就是说,大多数情况下,这些东西最终都被序列化了!) 我想重新编写这段代码,使它更健壮,性能更好。基本上有两种方法可以做到这一点:我可以使用2.6+中的新版本,或者我可以使用某种基于反应器/事件的模型。我宁愿以后做,因为它更简单,更不容易出错 所以问题是什么样的框架最适合我的需要。以下是到目前为止我所知道的选项列表
- :Python反应器框架的老祖宗:看起来很复杂,但是有点臃肿。小任务的陡峭学习曲线
- 当前位置从现场的人那里。面向此类任务的基于Greenlet的框架。不过,我看了一下代码,它并不太漂亮:不符合pep8,到处都是打印(为什么人们在框架中这样做?),API似乎有点不一致
- :不成熟,现在似乎没有人使用它,尽管它基于libevent,所以它有一个坚实的后端
- :从stdlib:über低级别,似乎需要大量的腿部工作,以使某些东西起步
- :虽然这是一款面向服务器的产品,旨在为动态网站提供服务,但它的特点是简单易用。看起来它可以完成任务,但不是它的目的。 [编辑:不幸的是,它不能在Windows上运行,这对我来说并不重要-这是我支持这个蹩脚平台的一个要求]
libevent
循环透明地实现异步,因此它应该与真正的异步服务器一样高效
我想它在这方面类似于Eventlet
缺点是它的API与Python的套接字
/线程
模块大不相同;您需要重写相当一部分应用程序(或编写一个兼容性填充层)
编辑:似乎也有类似的,但它使用Python2.5的增强生成器,而不是Greenlet。这使得它比并发和其他替代方案更具可移植性。网络I/O直接通过epoll/kqueue/iocp完成。Twisted很复杂,你说得对。Twisted不是bloa特德 如果你看看这里:你会发现一套有组织的、全面的、经过良好测试的互联网协议,以及编写和部署非常复杂的网络应用程序的帮助代码。我不会把膨胀和全面混为一谈
众所周知,Twisted文档乍一看并不是最为用户友好的,我相信这会让很多人失望。但是Twisted是惊人的(IMHO)如果你投入时间的话。我投入了时间,并且证明是值得的,我建议其他人也尝试同样的方法。这些解决方案都无法避免GIL阻止CPU并行这一事实-它们只是获得IO并行性的更好方法,而你已经有了线程。如果你认为你可以做得更好的IO,那么一定要追求其中之一但是,如果您的瓶颈是在处理结果,那么除了多处理模块之外,这里没有任何帮助。还没有提到。它的并发模型基于将组件连接在一起,并在收件箱和发件箱之间传递消息。这是一个简要的概述。我甚至不想称之为Twisted bloated,但是这很难让你头脑清醒。我很长一段时间都没有真正进入学习阶段,因为我一直希望“小任务”能做得简单一点 然而,现在我已经用它做了一些更多的工作,我不得不说,包括所有的电池是非常好的 我使用过的所有其他异步库都远没有它们看起来那么成熟。Twisted的事件循环是可靠的 我不太确定如何解决这个陡峭的学习曲线。如果有人能把它叉起来,清理一些东西,比如去除所有向后兼容的积垢和死掉的项目,可能会有帮助。但我想这是成熟软件的本质。是 在API方面,它遵循与标准库(特别是线程和多处理模块)相同的约定,在这里它是有意义的。因此,您可以使用熟悉的东西,如和 它只支持(<
res = obj.method( args )
# code continues here without waiting for method to finish
do_something_else( )
print "Result = %d" % res # Code will block here, if res not calculated yet