tornadoにおける非同期処理スキーム
tornadoにおける非同期処理方法 tornadoでは、他のビジネスのrestインタフェースを呼び出す必要がある場合があります.この場合、非同期処理が必要です. 一、requestsの問題 二、tornadoにおける非同期
tornadoでは、他のビジネスのrestインタフェースを呼び出す必要がある場合があります.この場合、非同期処理が必要です.
一、requestsの問題
tornadoのリクエストでrequestsを使用すると、requestsがtornadoをブロックしていることがわかります.たとえば、次のようなコードがあります.
ここのpostリクエストはブロックされて戻ってくるのを待っています.だからこの時の正しいやり方は非同期の方法を使うべきだ.ここで非同期は実はunirestなどが可能で、tornadoを使って実現することもできます
二、tornadoにおける非同期
注意関数のアクセサリ@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)は、応答オブジェクトを返す.その後、処理を続行して結果を返すとよい.
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)は、応答オブジェクトを返す.その後、処理を続行して結果を返すとよい.