• <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

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

            python Tornado異步服務器

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

            服務端異步方式:有兩種,一種是yield掛起函數,另外一種就是使用類線程池的方式 還有一種Future
            1、yield:掛起函數協程,盡管沒有block主線程,因為需要處理返回值,掛起到響應執行還是有時間等待
             1 class AsyncTaskHandler(tornado.web.RequestHandler):
             2   @tornado.web.asynchronous
             3   @tornado.gen.coroutine
             4   def get(self, *args, **kwargs):
             5     # yield 結果
             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:當發送GET請求時,由于方法被@gen.coroutine裝飾且yield 一個 Future對象,那么Tornado會等待,等待用戶向future對象中放置數據或者發送信號,如果獲取到數據或信號之后,就開始執行done方法。

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

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

             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 的實例,啟動事件循環機制,配合非阻塞的 HTTP Server 工作

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

            亚洲成色999久久网站| 成人免费网站久久久| 日韩va亚洲va欧美va久久| 伊人久久综合成人网| 成人国内精品久久久久影院VR| 久久精品亚洲中文字幕无码麻豆| 久久久亚洲AV波多野结衣| 久久精品中文字幕无码绿巨人| www.久久99| 伊人久久大香线蕉综合Av | 精品久久久久中文字幕日本| 亚洲人成伊人成综合网久久久| 久久精品成人免费网站| 2020久久精品亚洲热综合一本| 亚洲综合精品香蕉久久网| 久久影院午夜理论片无码| 热久久国产精品| 大伊人青草狠狠久久| 日本强好片久久久久久AAA| 人妻中文久久久久| 人人狠狠综合久久亚洲| 久久久久99精品成人片| 久久国产精品久久精品国产| 久久午夜羞羞影院免费观看| 人妻无码αv中文字幕久久琪琪布| 久久毛片一区二区| 国产aⅴ激情无码久久| 久久亚洲精品成人av无码网站| 久久水蜜桃亚洲av无码精品麻豆| 久久精品中文无码资源站| 久久久亚洲欧洲日产国码aⅴ | 亚洲日韩中文无码久久| 日产精品久久久久久久性色| 国产福利电影一区二区三区久久久久成人精品综合 | 一本久久免费视频| 亚洲国产精品无码久久久蜜芽| 国产成人久久精品一区二区三区| 久久久久亚洲av无码专区喷水 | 久久精品二区| 久久精品无码一区二区三区| 国产精品欧美久久久久无广告|