4

我想知道为什么在这个函数中:

@tornado.gen.engine
def check_status_changes(netid, sensid):

    como_url = "".join(['http://131.114.52:44444/ztc?netid=', str(netid), \
               '&sensid=', str(sensid), '&start=-5s&end=-1s'])

    http_client = AsyncHTTPClient()
    response = yield tornado.gen.Task(http_client.fetch, como_url)

    if response.error:
        raise Exception(response.error)

当有 response.error 时,我得到标题错误......为了在另一个函数中捕获返回的值,我必须做出什么?

我会做类似的事情:

try:
        periodic = tornado.ioloop.PeriodicCallback(check_status_changes(netid, sensid), 5000)
        value = periodic.start()
        print("Secondo")
        print value
    except:
        print("Quarto")
        periodic.stop()
        self.finish()
        return
    else:

我不知道...我只是将返回的值与另一个值进行比较...

谢谢你。

4

3 回答 3

4

该函数有一个gen.engine装饰器,您不能从其中返回值(与龙卷风无关,您不能在生成器中返回值)。

如果您试图从该函数中获取一个值 - 前提是您在 IOLoop 上调用它 - 则该函数应该有一个callback(可调用的)关键字参数,如下所示:

@tornado.gen.engine
def check_status_changes(netid, sensid, callback=None):
    response = yield tornado.gen.Task(do_your_thing)
    if response.error:
        raise response.error
    callback(response.body)  # this is how you make the value available to the
                             # caller; response.body is HTTPResponse specific iirc

现在您可以在其他地方调用此函数,如下所示:

# somewhere in a gen.engine decorated async method
body = yield tornado.gen.Task(check_status_changes, netid, sensid)
于 2013-04-06T18:09:22.217 回答
4

您可以使用

raise tornado.gen.Return(response)
于 2015-09-22T17:43:09.020 回答
0
    class MainHandler(tornado.web.RequestHandler):
        @gen.coroutine
        def get(self):
            http_client = AsyncHTTPClient()
            http_client = tornado.httpclient.AsyncHTTPClient()
            response = yield http_client.fetch('http://localhost:1338/api/getDistinctGeoPositions/?durationInMinutes=9000')
            if response.error:
                print response.error
            self.finish(response.body)
于 2018-02-09T09:12:46.727 回答