2013-12-13 3 views
1

Я просто новичок в Tornado, но не Python.Как понять Tornado gen.coroutine

Я пытаюсь написать асинхронный клиент для CouchDB (используя пакет couchdb).

Через 1 день исследования/Googling, я обнаружил каждые посты просто используя HttpAsyncClient, например, и не говорит, почему и как gen.coroutine работы. Исходный код просто слишком сложно для меня понять причины декоратора после декоратор HttpAsyncClient плохой пример для меня ...

ответ

0

Честно говоря, для ма это было только после прочтения источника, что я (частично) понял логику

это вроде как это работает, если вы украсили somefunction() с tornado.gen:

  1. в заявлении yield somefunction() SomeFunction() на самом деле называется
  2. Поскольку это обертка, не выполняется ваш код, но tornado.coroutine.gen. Он запускает ваш код до первого yield в somefunction
  3. Если появляется будущее (placehodler) (возвращается к коде декоратора!), Торнадо говорит: «Хорошо, когда это будущее решает, планируйте задачу (IOLoop callback) для IOLoop так, чтобы что он называет некоторые another_callback() ».
  4. Чтобы отслеживать, как далеко закончилось выполнение вашего somefunction(), Tornado поддерживает специальный объект под названием Runner. Он помнит последний оператор yield, который заблокировал выполнение вашего somefunction() и в первый раз запускается при выполнении декоратора gen.
  5. После точки 3, где будущий был «зарегистрирован», этот Runner возвращается из основных run() метода и декоратора выходов, возвращая будущую свой собственный
  6. Когда будущее с точки 3. готово, он добавляет задачу IOLoop , который затем вызывает another_callback. Последний - это специальный обратный вызов, созданный Торнадо, в скором времени, это тот же Бегун, который работал, когда в пункте 3. вновь появилось Будущее.
  7. Runner использует .send() метод, чтобы ввести значение вновь разрешенного будущего обратно к somefuncion, которые вызывают айт быть назначен переменной (если таковые имеются) в вашей функции в заявлении, как это:

    a = yield some_other_coroutine_for_example_async_client_fetch() 
    

ОК, это сущность, есть много недостатков, некоторые из которых я не могу обернуть вокруг головы, особенно обработка исключений, но HTH

+0

Да, обработка исключений - очень интересная часть. – Halst

0

Первый ответ покрывает много. Я просто хочу сообщить вам более простую абстракцию. @ Gen.coroutine

res = yield foo() 

сопрограмм идея asyncly выполнить foo(), особенно когда Foo занимает много IO или сетевой работы. Уступка может привести к выполнению и управлению передачей, скажем, вызывающему абоненту foo(). И он оставляет Runner для регистрации этой задачи foo() в качестве будущего объекта.Затем, когда foo() успешно возвращает результат, это волшебство случается, Runner отправит результат обратно в виде результата выполнения доходности (скажите разницу между результатом доходности и результатом выполнения выписки).

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