如何单独使用龙卷风的asynchttpclient?

时间:2015-08-17 10:51:01

标签: python asynchronous tornado

我是龙卷风的新手。

我想要的是编写一些函数来异步获取网页。由于这里没有请求处理程序,应用程序或服务器,我想我可以单独使用tornado.httpclient.AsyncHTTPClient。 但是所有示例代码似乎都在龙卷风服务器或请求处理程序中。当我试图单独使用它时,它永远不会起作用。 例如:

def handle(self,response):
    print response
    print response.body


@tornado.web.asynchronous
def fetch(self,url):
    client=tornado.httpclient.AsyncHTTPClient()
    client.fetch(url,self.handle)

fetch('http://www.baidu.com')

它说''str'对象没有属性'application'“,但我试图单独使用它?

或:

@tornado.gen.coroutine
def fetch_with_coroutine(url):
    client=tornado.httpclient.AsyncHTTPClient()
    response=yield http_client.fetch(url)
    print response
    print response.body
    raise gen.Return(response.body)
fetch_with_coroutine('http://www.baidu.com')

也不起作用。

之前,我尝试将回调传递给AsyncHTTPHandler.fetch,然后启动IOLoop,它可以工作并打印网页源代码。但我无法弄清楚如何处理ioloop。

2 个答案:

答案 0 :(得分:1)

@tornado.web.asynchronous只能应用于RequestHandler子类中的某些方法;它不适合这种用法。

您的第二个示例是正确的结构,但您需要实际运行IOLoop。在批处理式程序中执行此操作的最佳方法是IOLoop.current().run_sync(fetch_with_coroutine)。这将启动IOLoop,运行您的回调,然后停止IOLoop。您应该在run_sync()中运行单个函数,然后在该函数中使用yield来调用任何其他协程。

有关更完整的示例,请参阅https://github.com/tornadoweb/tornado/blob/master/demos/webspider/webspider.py

答案 1 :(得分:1)

以上是我过去使用过的一个例子......

from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop

AsyncHTTPClient.configure(None, defaults=dict(user_agent="MyUserAgent"))
http_client = AsyncHTTPClient()


def handle_response(response):
    if response.error:
        print("Error: %s" % response.error)
    else:
        print(response.body)


async def get_content():
    await http_client.fetch("https://www.integralist.co.uk/", handle_response)


async def main():
    await get_content()
    print("I won't wait for get_content to finish. I'll show immediately.")

if __name__ == "__main__":
    io_loop = IOLoop.current()
    io_loop.run_sync(main)

我还详细介绍了如何将Pipenv与tox.ini和Flake8一起使用此龙卷风示例,以便其他人能够更快地启动和运行https://gist.github.com/fd603239cacbb3d3d317950905b76096