tornado總結6-異步處理簡單使用

代碼

import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.gen
from tornado.httpclient import AsyncHTTPClient,HTTPRequest


class Test1Handler(tornado.web.RequestHandler):
    NEED_SLEEP = False

    @tornado.gen.coroutine
    def get(self):
        http_client = AsyncHTTPClient()
        http_request = HTTPRequest(url="http://localhost:8899/test2", method='GET', request_timeout=120)
        response = yield http_client.fetch(http_request)  #這個是異步處理的動做

        #每次間隔的訪問,使用tornado的睡眠機制 睡眠5秒中
        if Test1Handler.NEED_SLEEP:
            yield tornado.gen.sleep(20)  #這個是異步處理的動做
        Test1Handler.NEED_SLEEP = not Test1Handler.NEED_SLEEP

        # 徹底轉發報文頭部和body
        for h in response.headers:
            self.set_header(h, response.headers[h])
        return self.finish(response.body)

class Test2Handler(tornado.web.RequestHandler):
    SEQ = 0
    def get(self):
        Test2Handler.SEQ += 1
        print(Test2Handler.SEQ)
        return self.finish('TEST2 {0}'.format(Test2Handler.SEQ))

class Application(tornado.web.Application):
    def __init__(self):

        handlers = [
            (r"/test1", Test1Handler),
            (r"/test2", Test2Handler),
        ]

        tornado.web.Application.__init__(self, handlers)


if __name__ == "__main__":
    port = 8899
    application = Application()
    http_server = tornado.httpserver.HTTPServer(application, xheaders=True)
    http_server.listen(port)

    print('Listen on http://localhost:{0}'.format(port))
    tornado.ioloop.IOLoop.instance().start()

向"/test1"發送請求時,Test1Handler 使用 AsyncHTTPClient 異步的http客戶端轉發給了"/test2",並把test2的完整結果所有回覆給了"/test1"的請求方,使用瀏覽器打開多個標籤頁都訪問 http://localhost:8899/test1,就能夠看到效果了。html

tornado使用裝飾器@tornado.gen.coroutine,來代表該請求裏面可能有異步處理, 須要進行異步處理的動做前面會用yield來講明。python

我在Test1Handler裏面使用 yield tornado.gen.sleep(20) 來進行異步睡眠的操做, 這個睡眠操做不會阻塞整個python進程,tornado繼續處理其餘的請求。web

這個異步操做的方法極大的提升了效率,在單線程的python中,當你寫爬蟲操做的時候,就不須要等待前面一個請求有返回值以後再發送另一個請求,而是同時發送好幾個請求,當其中的某些請求正常返回的時候tornado會自動進行下一步操做。瀏覽器

 

其餘異步方法

1.異步睡眠

    yield tornado.gen.sleep(20)app

     這個睡眠不會阻塞python的線程,睡眠時tornado服務仍然在正常的運行異步

2.異步調用

IOLoop.instance().add_callback(callback, *args, **kwargs)

將callback加入到tornado的加入到的處理隊列裏面。tornado

 

IOLoop.instance().call_later(delay, callback, *args, **kwargs)oop

延時delay秒以後,將callback加入到tornado的加入到的處理隊列裏面fetch

 

還有其餘異步調用的方法:url

http://www.tornadoweb.org/en/stable/ioloop.html#running-an-ioloop

 

3.定時調用

http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.PeriodicCallback

tornado.ioloop.PeriodicCallback(callbackcallback_timeio_loop=None)

callback設定定時調用的方法

callback_time設定每次調用之間的間隔

值得注意的是每次調用之間沒有任何關係,若是上次的調用尚未處理完,本次的調用仍然會繼續跑, 能夠經過繼承這個類,而後加入一些判斷機制,來保證一次調用處理完,才能進行下一次調用。

相關文章
相關標籤/搜索