如何使用 epoll 和 Python 3.1 进行异步 HTTP 请求

3

更新:经过与Py3的长时间奋斗,包括编写自己的异步Web服务器(根据Dave Beazley的演示),我最终放弃了Python(以及大量我的代码)-: 转而使用运行在NodeJS上的CoffeeScript。看看这个:GitHub(现在你会发现95%的有趣代码都在这里),npm(无法更用户友好的软件包管理器;永别了,easy_install,你从未实现你的名字),一个非常庞大的模块库(几乎每天24/7发布大量新内容),一个庞大而充满活力的社区,开箱即用的异步HTTP和文件处理等等...所有这些(感谢V8),速度快到接近光速的三分之一 - 这还有什么不喜欢的呢?阅读更多宣传资料:"脚本的未来"(幻灯片托管由SpreeWebdesign提供)。

有一篇有趣的页面http://scotdoyle.com/python-epoll-howto.html,介绍了如何在Python 3中进行异步/非阻塞/AIO HTTP服务。

Tornado Web服务器包含非阻塞HTTP客户端。我已经成功将服务器的部分内容移植到Python 3.1,但是客户端的实现需要pyCurl,而且似乎存在问题(一位参与者表示“Libcurl非常让人头痛”,并且看着难看的pyCurl页面,我怀疑pyCurl不会很快出现在Py3+上)。

现在 epoll 已经被纳入标准库,使用 Python 可以直接进行异步 http 请求。我真的不想使用 asyncore 或其他类似的工具;epoll 以其卓越的性能而著称,且已经成为 Python 发行版的一部分,因此在非阻塞 http 方面除了 epoll 使用其他任何东西都是高度反直觉的(如果您愿意可以证明我错)。
哦,我认为线程是可怕的。不要使用线程。我使用 stackless
对于进一步感兴趣的异步 http 主题的人们,不要错过这个 Peter Portante 在 PyCon2010 上的演讲;另外还有 keynote,在其中演讲者 Antonio Rodriguez 强调了拥有最新的 Web 技术库对于标准库的重要性。

编辑有许多方法可以在资源消耗很少的情况下实现高吞吐量。然而,不仅是我认为放弃线程(和其他部分过时的方法)是正确的;Google Skipfish项目 的工作人员似乎也持类似观点:他们说Skipfish使用一种多路复用的、单线程的、完全异步的网络I/O和数据处理模型,该模型消除了某些多线程客户端中存在的内存管理、调度和IPC效率问题。

4个回答

1

顺便提一下,我有一个库在这里: http://github.com/mnot/nbhttp/

客户端已经作为redbot.org的一部分投入生产了。

我没有在Python 3中尝试过它,但它可能对你的工作有所帮助。

祝好,


0

这个投票中,几个月前,Giampaolo Rodolá说:

我有一个添加epoll()支持的补丁,它已经准备好了(asyncore支持poll(),而不是epoll()),只需要编写测试。

我不确定在哪里可以找到那个补丁,但这似乎是一个简单的任务,应该可以轻松地移植到asyncore(标准Python库用于异步服务器和客户端的方法,虽然远远落后于Twisted或Tornado,但这就是标准库的特点;-)。


是的,但 epoll 也在标准库中... 正如一些人指出的那样(例如 http://bytes.com/topic/python/answers/29901-asyncore-deficiencies),asyncore 可能会很麻烦。我真的已经决定使用 epoll 了... - flow

0

-2

Python 3缺乏库。你似乎对帮助你完成任务的库很感兴趣,那么为什么要使用Python 3来解决你的问题呢?


Python 3 是未来!;-) 实际上,Python 3 的标准库比 2.x 系列的要好一些。从语言方面来说,有很多改进;其中包括对字符串编码问题的合理处理。有了这个,大多数编码头疼问题都已经消失了!我想坚持使用 Python 2 将成为一种普遍现象,就像 Python 1.5.x 和 Internet Explorer 6 一样。实际上,我只是在构建一个进程间通信的工具,以便我可以在 Python 2.6 和 3.1 下运行一些东西...但是在 3.1 中正确地完成会更好! - flow
@flow: 所有字符串编码的改进都被移植到2.6,所以这并不是很大的改进 - 你只需要 from __future__ import unicode_literals 就可以了!实际上,大多数改进都已经被移植了,而且你会失去一些库,所以暂时来说,py3 更像是一种痛苦而不是一种改进。也许他们将来会推出一些吸引人们使用 py3 的东西,但是这些改进还不足以弥补升级带来的麻烦。 - nosklo
1
Python 2.x已经停止开发,这意味着在该分支上启动任何项目都是极不明智的。除此之外,我建议现在转向NodeJS——请参阅我的问题更新中的介绍。 - flow
@flow:仅仅因为它停止了官方开发并不意味着使用它是不可取的。当它解决了你的问题并拥有你想要的功能时,使用它是极其明智的。我不会建议像“你必须抛弃一切并从头开始重写,因为有了新版本的语言”这样的事情。即使语言版本号更高,这似乎是倒退的。实际上,版本号在决定某些东西是否可取时似乎并不重要。话虽如此,Python 2.x 的开发在名为“pypy”的新更快实现下继续进行。 - nosklo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接