2015-08-17 2 views
0

Я новичок в торнадо.Как использовать асинхронный атлас торнадо?

Я хочу написать несколько функций для асинхронного выбора веб-страниц. Поскольку здесь нет обработчиков запросов, приложений или серверов, я думаю, что могу использовать только 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') 

Он говорит: «„ул“объект не имеет атрибута" приложение», но я пытаюсь использовать это в одиночку?

или:

@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.

ответ

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

+0

я заметил run_sync в то время я сделал этот пост. Вы имеете в виду, что нет ничего плохого, если я начинаю и останавливаю ioloop каждый раз, когда запрос сделан, и он все еще работает асинхронно? – user17

+0

Обычный способ использования Tornado - вызывать 'run_sync()' (или 'start()') ровно один раз. Вызов 'run_sync()' более одного раза (за исключением тестов) необычен, и в большинстве случаев ему не хватает точки асинхронного программирования (путем одновременного синхронного асинхронного действия, вы исключаете преимущества параллелизма). –

Смежные вопросы