• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            python Tornado異步服務(wù)器

            Tornado基于Epoll(unix為kqueue)的異步網(wǎng)絡(luò)IO,Tornado的異步包括兩個方面,異步服務(wù)端和異步客戶端。無論服務(wù)端和客戶端,具體的異步模型又可以分為回調(diào)(callback)和協(xié)程(coroutine)
            裝飾器說明:
            @tornado.web.asynchronous 裝飾器適用于callback-style的異步方法,如果是協(xié)程則可以用@tornado.gen.coroutine來修飾。
            對于用@tornado.web.asynchronous 修飾的異步方法,需要主動self.finish()來結(jié)束該請求,普通的方法(get()等)會自動結(jié)束請求在方法返回的時候。

            服務(wù)端異步方式:有兩種,一種是yield掛起函數(shù),另外一種就是使用類線程池的方式 還有一種Future
            1、yield:掛起函數(shù)協(xié)程,盡管沒有block主線程,因為需要處理返回值,掛起到響應(yīng)執(zhí)行還是有時間等待
             1 class AsyncTaskHandler(tornado.web.RequestHandler):
             2   @tornado.web.asynchronous
             3   @tornado.gen.coroutine
             4   def get(self, *args, **kwargs):
             5     # yield 結(jié)果
             6     response = yield tornado.gen.Task(self.ping, ' www.google.com')
             7     print 'response', response
             8     self.finish('hello')
             9  
            10   @tornado.gen.coroutine
            11   def ping(self, url):
            12     os.system("ping -c 2 {}".format(url))
            13     return 'after'
            2、線程池:
             1 from concurrent.futures import ThreadPoolExecutor
             2  
             3 class FutureHandler(tornado.web.RequestHandler):
             4   executor = ThreadPoolExecutor(10)
             5  
             6   @tornado.web.asynchronous
             7   @tornado.gen.coroutine
             8   def get(self, *args, **kwargs):
             9  
            10     url = 'www.google.com'
            11     tornado.ioloop.IOLoop.instance().add_callback(functools.partial(self.ping, url))
            12     self.finish('It works')
            13  
            14   @tornado.concurrent.run_on_executor
            15   def ping(self, url):
            16     os.system("ping -c 2 {}".format(url))

            要返回值也很容易。再切換一下使用方式接口。使用tornado的gen模塊下的with_timeout功能(這個功能必須在tornado>3.2的版本)。
             1 class Executor(ThreadPoolExecutor):
             2   _instance = None
             3  
             4   def __new__(cls, *args, **kwargs):
             5     if not getattr(cls, '_instance', None):
             6       cls._instance = ThreadPoolExecutor(max_workers=10)
             7     return cls._instance
             8  
             9  
            10 class FutureResponseHandler(tornado.web.RequestHandler):
            11   executor = Executor()
            12  
            13   @tornado.web.asynchronous
            14   @tornado.gen.coroutine
            15   def get(self, *args, **kwargs):
            16  
            17     future = Executor().submit(self.ping, 'www.google.com')
            18  
            19     response = yield tornado.gen.with_timeout(datetime.timedelta(10), future,
            20                          quiet_exceptions=tornado.gen.TimeoutError)
            21  
            22     if response:
            23       print 'response', response.result()
            24  
            25   @tornado.concurrent.run_on_executor
            26   def ping(self, url):
            27     os.system("ping -c 1 {}".format(url))
            28     return 'after
            Future:當發(fā)送GET請求時,由于方法被@gen.coroutine裝飾且yield 一個 Future對象,那么Tornado會等待,等待用戶向future對象中放置數(shù)據(jù)或者發(fā)送信號,如果獲取到數(shù)據(jù)或信號之后,就開始執(zhí)行done方法。

            異步非阻塞體現(xiàn)在當在Tornaod等待用戶向future對象中放置數(shù)據(jù)時,還可以處理其他請求。

            注意:在等待用戶向future對象中放置數(shù)據(jù)或信號時,此連接是不斷開的。

             1 import tornado.ioloop
             2 import tornado.web
             3 from tornado import gen
             4 from tornado.concurrent import Future
             5 
             6 future = None
             7 class MainHandler(tornado.web.RequestHandler):
             8     @gen.coroutine
             9     def get(self):
            10         global future
            11         future = Future()
            12         future.add_done_callback(self.done)
            13         yield future
            14 
            15     def done(self, *args, **kwargs):
            16         self.write('Main')
            17         self.finish()
            18 
            19 class IndexHandler(tornado.web.RequestHandler):
            20     def get(self):
            21         global future
            22         future.set_result(None)
            23         self.write("Index")
            24 
            25 application = tornado.web.Application([
            26     (r"/main", MainHandler),
            27     (r"/index", IndexHandler),
            28 ])
            29 
            30 if __name__ == "__main__":
            31     application.listen(8888)
            32     tornado.ioloop.IOLoop.instance().start()  #啟動 IOLoop 的實例,啟動事件循環(huán)機制,配合非阻塞的 HTTP Server 工作

            posted on 2019-07-14 15:22 Benjamin 閱讀(544) 評論(0)  編輯 收藏 引用 所屬分類: python

            怡红院日本一道日本久久 | 日韩中文久久| 青青青青久久精品国产h| 久久99国产精品一区二区| 欧美亚洲另类久久综合婷婷| 人妻无码久久精品| 99精品国产在热久久无毒不卡| 久久国产热这里只有精品| 久久无码专区国产精品发布 | 久久综合视频网| 成人久久免费网站| 美女久久久久久| 精品久久久久久99人妻| 国产午夜精品理论片久久影视| 亚洲国产成人久久精品影视| 99国产精品久久| 国产成人综合久久精品红 | 日韩精品久久久久久久电影| 久久精品九九亚洲精品| 中文字幕无码精品亚洲资源网久久| 久久亚洲精品人成综合网 | 久久久国产精品| 99久久www免费人成精品| 中文字幕久久精品无码| 午夜精品久久久久| 无码任你躁久久久久久| 99久久精品免费观看国产| www.久久精品| 国内精品伊人久久久久| 久久久久人妻一区精品色| 亚洲中文久久精品无码ww16| 怡红院日本一道日本久久 | 久久人人爽爽爽人久久久| 亚洲AV无码1区2区久久| 狠狠综合久久综合88亚洲| 欧美久久一区二区三区| 亚洲国产成人久久一区WWW| 久久久无码精品亚洲日韩京东传媒| 亚洲精品午夜国产va久久| 日韩影院久久| 欧美精品国产综合久久|