有没有适用于Stackless Python 3.1的基本非阻塞HTTP客户端现成解决方案?

4 投票
2 回答
1558 浏览
提问于 2025-04-15 19:57

更新:经过一番努力,我尝试了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

  1. 在无栈、协作调度的环境中是唯一有意义的方式;

  2. 在Stackless Python 3中是可行的,得益于标准库中的select epoll(在Py2.6中引入;一些解决方案更喜欢libevent,但这又是一个障碍,因为pyevent项目似乎在Py2.5时就停止了开发);

  3. 遗憾的是,这仍然不是一个普遍的选择,大多数人仍依赖于阻塞的HTTP。

现在看来,我可能需要学习一些套接字编程的基础知识,自己编写HTTP服务器/客户端库。我对此任务仍有些畏惧,因为我在这方面的背景很少,可能会“重蹈覆辙”。

我会非常高兴收到任何相关的建议。我特别喜欢使用select.epoll的解决方案;我记得它比旧的asyncore更具可扩展性(但也许有人对此有更准确的数据)。作为最低要求,解决方案应该能在Ubuntu 9.10上运行。

2 个回答

0

非阻塞的HTTP情况在Twisted中处理得非常好。它的做法是创建一系列的回调函数,并将这些回调函数与“延迟”对象注册在一起。你可以看看Twisted的文档,里面有很多有用的信息。Stackless使用的是微线程,但Twisted则是通过将整个网络框架分成一个个小片段,使用非阻塞代码和回调、错误回调以及延迟对象来编写的,这些都是在一个主反应循环中运行的,整个过程只用一个线程。可以说,这样的方式应该能更好地处理异步HTTP的事情。

0

我知道这就像是让死去的事物复活一样(而且 flow 可能早就解决了他的问题),但为了完整性,stackless 在 3.1.3 版本中是可以使用的:

关于如何使用 stacklesssocket 实现一个 HTTP 服务器的信息,可以参考这里:

撰写回答