有没有适用于Stackless Python 3.1的基本非阻塞HTTP客户端现成解决方案?
更新:经过一番努力,我尝试了Python 3,包括自己写了一个异步的网络服务器(参考了Dave Beazley的演讲),最终我放弃了Python(还有一大堆我的代码)-: 转而选择了在CoffeeScript上运行的NodeJS。你可以看看:GitHub(现在有95%的有趣代码都在这里),npm(一个非常用户友好的包管理工具;真是太好了,easy_install
,你从来没有配得上你的名字),还有一个庞大的模块库(几乎24小时都有新东西发布),一个活跃的社区,开箱即用的异步HTTP和文件处理……这一切(多亏了V8)以光速的三分之一运行——有什么不好呢?想了解更多宣传内容,可以看看:“脚本的未来”(幻灯片由SpreeWebdesign提供)。
我在寻找一种方法,以异步、非阻塞的方式提供HTTP服务(并进行HTTP请求)。当我选择了Stackless Python 3.1(详细信息请见这里)时,这似乎很难做到。
有一些基本的例子,比如一篇非常有用且详细的文章如何在Python中使用Linux epoll,还有一个名为stacklessexamples的Google代码项目,里面包含了一些有价值的信息(但没有兼容Python 3.x的代码)。
所以,在网上研究了很多天,试图把我找到的东西拼凑在一起:有没有人知道一个相对好用的异步HTTP库?它不必符合WSGI标准(我对此不感兴趣)。
服务器部分应该能够处理多个非阻塞的HTTP请求(并可能进行基本的HTTP头处理);HTTP客户端部分应该能够以非阻塞的方式通过HTTP请求获取网页内容(也进行基本的头处理,但不需要像授权这样的复杂功能)。
到目前为止,我的研究显示,非阻塞的HTTP
在无栈、协作调度的环境中是唯一有意义的方式;
在Stackless Python 3中是可行的,得益于标准库中的
select epoll
(在Py2.6中引入;一些解决方案更喜欢libevent
,但这又是一个障碍,因为pyevent项目似乎在Py2.5时就停止了开发);遗憾的是,这仍然不是一个普遍的选择,大多数人仍依赖于阻塞的HTTP。
现在看来,我可能需要学习一些套接字编程的基础知识,自己编写HTTP服务器/客户端库。我对此任务仍有些畏惧,因为我在这方面的背景很少,可能会“重蹈覆辙”。
我会非常高兴收到任何相关的建议。我特别喜欢使用select.epoll
的解决方案;我记得它比旧的asyncore
更具可扩展性(但也许有人对此有更准确的数据)。作为最低要求,解决方案应该能在Ubuntu 9.10上运行。
2 个回答
非阻塞的HTTP情况在Twisted中处理得非常好。它的做法是创建一系列的回调函数,并将这些回调函数与“延迟”对象注册在一起。你可以看看Twisted的文档,里面有很多有用的信息。Stackless使用的是微线程,但Twisted则是通过将整个网络框架分成一个个小片段,使用非阻塞代码和回调、错误回调以及延迟对象来编写的,这些都是在一个主反应循环中运行的,整个过程只用一个线程。可以说,这样的方式应该能更好地处理异步HTTP的事情。
我知道这就像是让死去的事物复活一样(而且 flow 可能早就解决了他的问题),但为了完整性,stackless 在 3.1.3 版本中是可以使用的:
关于如何使用 stacklesssocket 实现一个 HTTP 服务器的信息,可以参考这里: