tornodo異步請求

1.訪問請求異步web

# 1.保證請求是異步的
class Test(tornado.web.RequestHandler):

    def get(self):
        self.write({'k1': 'v1'})

    def post(self):
        self.write({'k1': 'v1'})


@gen.coroutine
def doing():
    # time.sleep(3) #同步的時候用的,異步不起做用
    yield tornado.gen.sleep(10)
    raise tornado.gen.Return('你好')


class Test1(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        res = yield doing()
        self.write(res)

    def post(self):
        self.write({'k2': 'v2'})
測試

結果:數據庫

http://127.0.0.1:8000/test1/延遲10秒,http://127.0.0.1:8000/test/不受影響,正常訪問。併發

2.併發執行(場景:實時前段展現,實時插入數據庫)異步

@gen.coroutine
def doing():
    gen.sleep(2)
    raise gen.Return('年後')


class Test1(tornado.web.RequestHandler):
    @gen.coroutine
    def get(self):
        start = time.time()
        #併發執行
        res, res1 = yield [doing(), doing()]
        print(time.time() - start)
        self.write(res + res1)

    def post(self):
        self.write({'k2': 'v2'})
執行時間2s+
async def doing():
    await gen.sleep(2)
    return '那你還能'

class Test1(tornado.web.RequestHandler):

    async def get(self):
        start = time.time()
        #併發執行
        res, res1 = await gen.convert_yielded([doing(), doing()])
        print(time.time() - start)
        self.write(res + res1)

    def post(self):
        self.write({'k2': 'v2'})
利用3.5 async和await

await 關鍵字比 yield 關鍵字功能要少一些. 例如,在一個使用 yield 的協程中, 你能夠獲得Futures 列表, 你也可使用 tornado.gen.convert_yielded 來把任何使用 yield 工做的代碼轉換成使用 await 的形式.async

coroutine 是給Non-blocking 函數提供異步協程的方式運行,ide

3.線程池異步函數

from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor


class Test1(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor()

    @gen.coroutine
    def get(self):
        start = time.time()
        res, res1 = yield [self.doing(), self.doing()]
        print(time.time() - start)
        self.write(res + res1)

    @run_on_executor
    def doing(self):
        time.sleep(2)
        return '22'

    def post(self):
        self.write({'k2': 'v2'})
線程方法
相關文章
相關標籤/搜索