Я экспериментировал с Python 2.7 и Tornado 3.2. Я пытался получить простой сопрограмму пример работать, но без особого везения:Не могу получить повышение Вернуться к работе при использовании сопрограммы
import tornado.web
from tornado.gen import coroutine
from tornado.httpclient import AsyncHTTPClient
from tornado.gen import Return
class MainHandler(tornado.web.RequestHandler):
# Tried with and without @asynchronous
@tornado.web.asynchronous
def get(self):
data = MainService().get_google_data()
self.write(data)
class MainService:
@coroutine
def get_google_data(self):
response = yield AsyncHTTPClient().fetch("http://www.google.com")
raise Return(value = 'hello')
Я ожидал, что это будет выписывать «привет», когда керлинг URL. Вместо этого, я получаю:
...
File "/vagrant/venv/lib/python2.7/site-packages/tornado/web.py", line 656, in write
raise TypeError("write() only accepts bytes, unicode, and dict objects")
TypeError: write() only accepts bytes, unicode, and dict objects
По-видимому, будущее возвращается, но называть result()
на будущее бросает еще одно исключение: DummyFuture does not support blocking for results
Торнадо документы говорят, что для того, чтобы вернуть значение из сопрограммы, вы получаете исключение возврата. Рассматривая исходный код, это действительно похоже на то, что ожидается. Тем не менее, когда я запускаю его, он, похоже, не работает.
Оцените это!
Копаем глубже в Runner.run(), я чувствую, что, возможно, перешел к выводам о том, что это делает. – MrSilverSnorkel
Как в стороне, вы можете просто «поднять Return ('hello») '. Нет необходимости в 'value ='. – dano
@ dano Да, значение = было просто без уважительной причины. Копая в Бегун, я вижу теперь, что он не совсем делает то, что, как я думал, на первый взгляд. Он возвращает будущее, которое, как я думаю, вы говорили в своем ответе. – MrSilverSnorkel