我有一个响应各种用户请求的web.py服务器。其中一个请求涉及下载和分析一系列网页。
有没有一种简单的方法可以在web.py中设置基于异步/回调的url下载机制?低资源使用率尤其重要,因为每个用户发起的请求都可能导致下载多个页面。
流程将如下所示:
User request -> web.py ->并行或异步下载10页->分析内容,返回结果
我认识到web.py是一种很好的方法,但是我已经在使用Twisted了,所以我对适合Twisted的东西特别感兴趣。
发布于 2010-04-23 16:24:41
使用异步http客户端,它使用asynchat和asyncore。http://sourceforge.net/projects/asynchttp/files/asynchttp-production/asynchttp.py-1.0/asynchttp.py/download
发布于 2010-12-20 00:31:56
下面是一段有趣的代码。我自己没有用过它,但它看起来很不错;)
https://github.com/facebook/tornado/blob/master/tornado/httpclient.py
低级AsyncHTTPClient:
“使用pycurl支持的非阻塞HTTP客户端。用法示例:”
import ioloop
def handle_request(response):
if response.error:
print "Error:", response.error
else:
print response.body
ioloop.IOLoop.instance().stop()
http_client = httpclient.AsyncHTTPClient()
http_client.fetch("http://www.google.com/", handle_request)
ioloop.IOLoop.instance().start()
“fetch()可以接受string URL或HTTPRequest实例,这提供了更多的选项,比如执行POST/PUT/DELETE请求。
AsyncHTTPClient构造函数的关键字参数max_clients决定了可以在每个IOLoop上并行执行的并发fetch()操作的最大数量。“
还有一些新的实现正在进行中:https://github.com/facebook/tornado/blob/master/tornado/simple_httpclient.py“无外部依赖的非阻塞HTTP client……这个类仍在开发中,尚未推荐用于生产。”
发布于 2009-03-21 05:02:48
一种选择是将工作发布到某种类型的队列中(您可以使用带有pyactivemq或STOMP的企业级应用程序作为连接器,也可以使用像Kestrel这样的轻量级应用程序,它是用Scala编写的,使用与memcache相同的协议,因此您可以使用python memcache客户端与之通信)。
一旦设置了排队机制,就可以创建订阅到队列的任意数量的工作任务,并根据需要执行实际的下载工作。你甚至可以让他们住在其他机器上,这样他们根本不会影响你网站的服务速度。当工作程序完成后,它们将结果发送回数据库或另一个队列,在那里When服务器可以提取它们。
如果你不想管理外部的工作进程,那么你可以在运行web服务器的同一个python进程中创建工作线程,但很明显,这会对你的网页服务性能产生更大的影响。
https://stackoverflow.com/questions/668257
复制相似问题