一个干净的,轻量级的替代Python的twisted?

2024-05-04 06:02:41 发布

您现在位置:Python中文网/ 问答频道 /正文

很久以前,我写了一个WebSpider,我通过多线程实现了并发请求的同时发生。那是在我的Python年轻时,在我知道GIL和它为多线程代码带来的相关灾难(即,大多数时候东西都是序列化的!)之前。。。

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

所以问题是什么样的框架最适合我的需要。以下是我目前了解的选项列表:

  • Twisted:Python reactor框架的鼻祖:看起来很复杂,但是有点臃肿。小任务学习曲线陡峭。
  • Eventlet:来自lindenlab的人。基于Greenlet的框架,面向这些类型的任务。不过,我看了一下代码,发现它不太漂亮:不符合pep8,到处都是打印出来的(为什么人们要在框架中这样做!),API似乎有点不一致。
  • PyEv:不成熟,似乎没有人使用它,虽然它是基于libevent的,所以它有一个坚实的后端。
  • asyncore:从stdlib:über的低级水平来看,似乎需要做大量的腿部工作,只是为了从地面上得到一些东西。
  • tornado:虽然这是一个面向服务器的产品,旨在为动态网站提供服务器,但它的特点是有一个async HTTP client和一个简单的ioloop。看起来它可以完成任务,但不是它的目的。 [编辑:不幸的是,它没有在Windows上运行,这对我来说算不上—这是我支持这个蹩脚平台的要求]

我有什么遗漏吗?当然,一定有一个库适合一个简化的异步网络库的最佳位置!

[编辑:非常感谢intgr为他指向this page的指针。如果您滚动到底部,您将看到一个非常好的项目列表,这些项目旨在以某种方式处理此任务。事实上,自Twisted诞生以来,事情似乎确实有所进展:人们现在似乎更喜欢基于co-routine的解决方案,而不是传统的面向reactor/回调的解决方案。这种方法的好处是更直接更直接的代码:我在过去发现了,特别是在使用C++中的{A14}时,基于回调的代码可以导致难以遵循的设计,并且对未受过训练的眼睛来说是相对模糊的。使用联合例程可以编写看起来至少更同步的代码。我想现在我的任务是找出我喜欢的这些库中的哪一个,然后试试看!很高兴我现在问…]

[编辑:任何关注或无意中发现这个问题或关心这个话题的人都可能感兴趣:我发现了一篇关于这个工作的the available tools当前状态的非常好的文章]


Tags: 项目方法代码服务器框架编辑列表序列化
3条回答

我喜欢concurrencePython模块,它要么依赖无堆栈的Python微线程,要么依赖greenlet实现轻量级线程。所有阻塞的网络I/O都通过单个libevent循环透明地实现异步,因此它的效率应该与真正的异步服务器差不多。

我想这和Eventlet类似。

缺点是它的API与Python的sockets/threading模块大不相同;您需要重写相当一部分应用程序(或者编写一个兼容性填充层)

编辑:似乎还有类似的cogen,但它使用Python2.5的增强生成器进行协程,而不是greenlet。这使得它比并发和其他替代方案更具可移植性。网络I/O直接使用epoll/kqueue/iocp完成。

扭曲是复杂的,你说得对。扭曲的是而不是肿胀。

如果你看一下这里:http://twistedmatrix.com/trac/browser/trunk/twisted你会发现一个有组织的、全面的、经过良好测试的一套internet的许多协议,以及编写和部署非常复杂的网络应用程序的帮助程序代码。我不会把臃肿和全面混为一谈。

众所周知,Twisted文档乍一看并不是最友好的用户界面,我相信这会赶走很多不幸的人。但是如果你投入时间的话,扭曲是很神奇的。我做到了,这证明是值得的,我建议其他人也试试。

geventeventlet cleaned up

在API方面,它遵循与标准库(特别是线程和多处理模块)相同的约定。所以你有一些熟悉的东西,比如QueueEvent要处理。

它只支持libeventupdate:libev since 1.0)作为reactor实现,但充分利用了它,它具有基于libevent http的快速WSGI服务器,并通过libevent DNS解析DNS查询,而不像大多数其他库那样使用线程池。(更新:因为1.0c-ares用于进行异步DNS查询;threadpool也是一个选项。)

像eventlet一样,它通过使用greenlets使回调和延迟变得不必要。

看看例子:concurrent download of multiple urlslong polling webchat

相关问题 更多 >