tornadoにおける非同期処理スキーム


tornadoにおける非同期処理方法
  • tornadoでは、他のビジネスのrestインタフェースを呼び出す必要がある場合があります.この場合、非同期処理が必要です.
  • 一、requestsの問題
  • 二、tornadoにおける非同期

  • tornadoでは、他のビジネスのrestインタフェースを呼び出す必要がある場合があります.この場合、非同期処理が必要です.
    一、requestsの問題
    tornadoのリクエストでrequestsを使用すると、requestsがtornadoをブロックしていることがわかります.たとえば、次のようなコードがあります.
    class test(tornado.web.RequestHandler):
        def get(self):
            self.write("error 404 ")
            print self.request.remote_ip
        def post(self):
            returndata = requests.post(http://127.0.0.1:9080/getreurn)
            self.write(returndata.content)
    

    ここのpostリクエストはブロックされて戻ってくるのを待っています.だからこの時の正しいやり方は非同期の方法を使うべきだ.ここで非同期は実はunirestなどが可能で、tornadoを使って実現することもできます
    二、tornadoにおける非同期
    import tornado
    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    import tornado.ioloop
    import tornado.web
    import tornado.gen
    import tornado.options
    import tornado.httpclient
    import tornado.concurrent
    class test(tornado.web.RequestHandler):
        def get(self):
            self.write("error 404 ")
            print self.request.remote_ip
    
        @tornado.web.asynchronous
        @tornado.gen.coroutine
        def post(self):
            http_client = tornado.httpclient.AsyncHTTPClient()
            http_req = tornado.httpclient.HTTPRequest(url='http://127.0.0.1:9080/getreurn', method='POST',body=json.dumps(data),headers={'Content-Type':'application/json'}, request_timeout=15)
            response = yield tornado.gen.Task(http_client.fetch, http_req)
            print response.body
            self.write(response.body)
    

    注意関数のアクセサリ@tornado.web.asynchronous @tornado.gen.coroutineという2つの装飾器は、次の非同期とジェネレータで使用するために使用されます.そうでない場合、ジェネレータはtornadoをエラーします.gen.Taskはtornadoが要求オブジェクトとコンテンツを反復実行するために使用する部分である
    http_client = tornado.httpclient.AsyncHTTPClient() http_req = tornado.httpclient.HTTPRequest(url=‘http://127.0.0.1:9080/getreurn’, method=‘POST’,body=json.dumps(data),headers={‘Content-Type’:‘application/json’}, request_timeout=15)1つは非同期クライアント1つはリクエストでありresponse=yield tornado.gen.Task(http_client.fetch,http_req)は、応答オブジェクトを返す.その後、処理を続行して結果を返すとよい.