如何在Python 3.1中使用epoll进行异步HTTP请求
更新:经过一番努力,我在使用Python 3的过程中,包括自己写了一个异步的网络服务器(参考了Dave Beazley的演讲),最后我放弃了Python(还有一大堆我的代码)-: 转而选择了在CoffeeScript上运行的NodeJS。你可以看看:GitHub(现在有95%的有趣代码都在这里),npm(一个超级友好的包管理工具;告别了easy_install
,你从来没有配得上这个名字),还有一个庞大的模块库(几乎24小时都有新东西发布),一个活跃的社区,开箱即用的异步HTTP和文件处理……这一切(多亏了V8)以光速的三分之一运行——有什么不好呢?想了解更多信息,可以看看这篇宣传文章:“脚本语言的未来”(幻灯片由SpreeWebdesign提供)。
这里有一个有趣的页面http://scotdoyle.com/python-epoll-howto.html,讲的是如何在Python 3中进行异步/非阻塞/AIO的HTTP服务。
还有一个Tornado网络服务器,它包含一个非阻塞的HTTP客户端。我已经成功将服务器的部分功能移植到Python 3.1,但客户端的实现需要pyCurl,而且似乎有问题(有参与者表示“Libcurl真是让人头疼”,看着那个非常丑陋的pyCurl页面,我怀疑pyCurl在Python 3+中会很快出现)。
现在epoll已经在标准库中可用了,应该可以直接用Python进行异步HTTP请求。我真的不想使用asyncore或其他东西;epoll被认为是这个任务的理想工具,而且它是Python发行版的一部分,所以在非阻塞HTTP中使用除了epoll以外的东西是非常不直观的(如果你觉得我错了,可以证明我)。
哦,我觉得线程真是糟糕。没有线程。我使用stackless。
对异步HTTP话题感兴趣的人不要错过Peter Portante在PyCon2010的演讲;还有主题演讲,演讲者Antonio Rodriguez在某个时刻强调了在标准库中拥有最新的网络技术库的重要性。
编辑 可能有很多方法可以在资源消耗少的情况下实现高吞吐量。然而,不仅仅是我认为放弃线程(和其他一些部分过时的方法)是对的;在Google Skipfish项目的人似乎也有类似的看法:他们说Skipfish使用的是
单线程多路复用,完全异步的网络I/O和数据处理模型,消除了某些多线程客户端中存在的内存管理、调度和进程间通信的低效。
4 个回答
circuits框架支持epoll,并且包含一个异步的客户端。
在这个投票中,几个月前,Giampaolo Rodolá提到:
我有一个补丁,几乎准备好了,可以添加对epoll()的支持(asyncore支持poll(),而不是epoll()),现在只需要写一些测试。
我不太确定在哪里能找到这个补丁,但看起来这个任务应该很简单,可以很容易地移植到asyncore
中(这是标准的Python库,用于异步服务器和客户端——当然,它比Twisted或Tornado落后很多,但这就是标准库的特点;-)。
顺便说一下,我有一个库可以在这里找到: http://github.com/mnot/nbhttp/
这个库的客户端部分已经在 redbot.org 上投入使用了。
我还没有在 Python 3 上试过,但这可能对你的工作有帮助。
祝好,