更新:在使用 Py3 进行了大量工作之后,包括编写我自己的异步 Web 服务器(在 Dave Beazley 的演示之后),我终于抛弃了 Python(以及我的一大堆代码)-:转而支持在NodeJS上运行的CoffeeScript。看看:GitHub(现在你可以在其中找到 95% 的有趣代码)、npm(对用户不友好的包管理器;很好摆脱,你从来没有辜负你的名字),一个疯狂的巨大的模块存储库(几乎 24/7 发布大量新内容),一个庞大而充满活力的社区,开箱即用的异步 HTTP 和文件处理......,所有这些(感谢V8)占三分之一光速easy_install
——有什么不喜欢的?阅读更多宣传:“脚本的未来”(幻灯片托管由SpreeWebdesign提供)。
有一个有趣的页面http://scotdoyle.com/python-epoll-howto.html关于如何在 python 3 中进行异步/非阻塞/AIO http服务。
有一个龙卷风网络服务器,它确实包括一个非阻塞的 http 客户端。我已经设法将服务器的某些部分移植到 python 3.1,但是客户端的实现需要pyCurl并且似乎有问题(一位参与者说 'Libcurl 是多么让人头疼',并看着令人难以置信的丑陋 pyCurl页面我怀疑 pyCurl 会很快到达 py3+)。
现在标准库中提供了 epoll,应该可以使用 python 开箱即用地执行异步 http 请求。我真的不想使用 asyncore 之类的;epoll 以作为该任务的理想工具而闻名,它是 python 发行版的一部分,因此使用除 epoll 之外的任何东西来实现非阻塞 http 是非常违反直觉的(如果你愿意,请证明我错了)。
哦,我觉得线程是可怕的。没有穿线。我使用无堆栈。
对异步 http 主题进一步感兴趣的人不应错过peter portante 在 PyCon2010 上的演讲;同样令人感兴趣的是主题演讲,演讲者安东尼奥·罗德里格斯 (antonio rodriguez) 曾强调在标准库中拥有最新的 Web 技术库的重要性。
编辑可能有很多方法可以以很少的资源消耗实现高吞吐量。然而,不仅仅是我认为放弃线程(以及其他部分过时的方法);谷歌skipfish项目的人似乎也有类似的想法:他们说skipfish使用
多路复用单线程、完全异步的网络 I/O 和数据处理模型,消除了一些多线程客户端中存在的内存管理、调度和 IPC 低效率。