基于Stackless Python 3.1的基本异步(非阻塞)HTTP客户端是否有现成的解决方案?

4

更新:经过与Py3的艰苦奋斗,包括编写自己的异步Web服务器(根据Dave Beazley的演示),我最终放弃了Python(以及大量我的代码)-: 转而选择在NodeJS上运行CoffeeScript。看看这个:GitHub(这里你会发现95%的有趣代码),npm(包管理器非常用户友好;告别了,easy_install,你从未做到你的名字),一个非常庞大的模块库(几乎每天都有大量新内容发布),一个庞大而充满活力的社区,开箱即用的异步HTTP和文件处理...,所有这些(感谢V8)以光速的三分之一的速度运行 - 还有什么不喜欢的?阅读更多宣传资料:{{link7:“脚本的未来”}}(幻灯片托管由SpreeWebdesign提供)。

我正在寻找一种异步的、非阻塞式的HTTP服务方式(以及进行HTTP请求)。当我决定使用Stackless Python 3.1(也可以参考这里获取文档)时,这似乎很难做到。
有一些基本的例子,比如相当详细和有价值的文章如何使用Linux epoll with Python,还有一个名为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。
现在看来,我需要学习套接字编程的基础知识,并自己编写HTTP服务器/客户端库。我仍然对这项任务感到犹豫,因为我在这个领域几乎没有背景,很可能会“重蹈覆辙”。

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


关于您提到的第三点,异步(也称为事件驱动)HTTP(以及其他网络)在需要超级可扩展性的情况下确实非常流行 - 除了asyncore之外,还有Twisted、Tornado以及Python之外的lighttpd 1.5(使用asyncio)、nginx、Erlang等;它只是很少与stackless Python一起使用,特别是其新版本3仍未广泛采用。 - Alex Martelli
这是我非常认同的观点,异步HTTP正在获得越来越多的关注,而且有很好的理由。如果标准库中有一个可靠的高性能开箱即用的解决方案,那不是很美妙吗?也许我们可以抛弃像aifcsndhdr这样的东西,利用这些空间来做更有用的事情? - flow
为什么选择Python3.1?为什么选择Stackless?你不满意一个好的2.6 Cpython解决方案吗?为什么要有这种人为的限制呢? - nosklo
1
远非感觉这种限制是人为的,我相信从Py2.x转移到Py3.x才是正确的选择。我仍然有很多软件在2.x下运行,但正在进行一项重大的重写。在2.x系列中这样做似乎是人为的,因为这些版本已经(可能)到达了它们的开发寿命的尽头。我完全意识到许多Python软件维护者不愿意进行转换;但是,无数项目在过去的某个时候已经停止了开发,并将在未来几年内过时。选择Py3就是顺应潮流! - flow
你在这里混淆了两个不同的问题:迁移到Python 3和使用Stackless或任何其他高性能HTTP。请自己好好处理它们,将它们分开来看待。 - GabiMe
对我来说,这听起来就像是在要求“一杯咖啡”时被回答“你把问题搞混了”——毕竟这是要求一个容器和一种饮料。这不是关于迁移到Py3,而是关于使用Py3——为什么不呢?Py3于2008年底发布,现在已经到了2012年初。最终的2.x版本是两年前发布的,这意味着Py2注定会消失。话虽如此,去年夏天(2010年)我转向了NodeJS和CoffeeScript,在使用Python编程十年后,我不再回头。Python开始让我感到陈旧。 - flow
2个回答

0

Twisted非阻塞HTTP案例处理得非常好,它创建了一系列回调函数,并将这些回调函数注册到延迟对象中。值得一提的是Twisted文档。Stackless使用微线程,但Twisted使用片段式的非阻塞代码链接回调、错误回调和延迟对象,在单个线程上运行主反应器循环来编写整个Web框架。我认为这应该更好地解决异步HTTP问题。


1
没有十匹马也不能让我碰那个称为Twisted的神秘大球,它是一团摇晃不定的东西(他们知道他们想要什么,他们做到了,并且给了他们的孩子正确的名字)。嘿,抓住NodeJS,你只需要不到十行代码就能得到一个异步Web服务器!这是2012年,所以再见了Stackless,我真的很喜欢你,但我不得不搬出城。另外,我很遗憾地说,截至2012年1月,Twisted不支持Py3,根据http://twistedmatrix.com/trac/milestone/Python-3.x和https://dev59.com/jnVC5IYBdhLWcg3w1Exq#214601的说法,可能还需要一些时间。2022年有人吗? - flow

0

谢谢你的关注!事实上,我现在已经按照David Beazley的建议构建了一个异步HTTP服务器(http://www.slideshare.net/dabeaz/a-curious-course-on-coroutines-and-concurrency-5286140)。它有点实验性质,实际上使用生成器作为协程,而不是Stackless Python。目前很难找到经过测试和证明的Python异步HTTP服务器,更不用说Python 3了。 - flow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接