更新:经过与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效率问题。