• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    Tornado的stackcontext

    來源:懂視網 責編:小采 時間:2020-11-09 13:25:06
    文檔

    Tornado的stackcontext

    Tornado的stackcontext:按:本人 python 菜鳥,對 tornado 更沒什么研究,這兩天小擺弄了一下,記一下,有不對的還請指正 這兩天在用 tornado 做一個 memcached 的 proxy,作為一個 Python 的高性能異步框架,tornado (實際是 epoll/kqueue )的思想是——單線程+異
    推薦度:
    導讀Tornado的stackcontext:按:本人 python 菜鳥,對 tornado 更沒什么研究,這兩天小擺弄了一下,記一下,有不對的還請指正 這兩天在用 tornado 做一個 memcached 的 proxy,作為一個 Python 的高性能異步框架,tornado (實際是 epoll/kqueue )的思想是——單線程+異

    這兩天在用 tornado 做一個 memcached 的 proxy,作為一個 Python 的高性能異步框架,tornado (實際是 epoll/kqueue… )的思想是——單線程+異步化,線程的運行時間不等待任何東西,這樣就要求 memcached 的訪問也必須異步化。如果線程在等待中消耗了,就無法達到高并發的目的,這個問題是無法通過簡單地交給線程池或什么其他東西來達到的。

    于是,這里就不能用常用的 python-memcache 來做了,實際上有幾個基于 tornado 的 memcache 客戶端,這個是維護得相對好的一個,也是一年前的了,而且,有兩個問題:

  • 連接建立是同步的,不是異步的
  • 沒有超時機制
  • 這樣,在 server 或網絡出現問題的時候,就可能遇到*煩,所以,我的目的就是絞盡腦汁加入超時機制,這個初步做出來了,等把 get 之外的方法也都異步化之后就反饋出來。這里主要依賴的機制就是 tornado 的 stack context——再次聲明,我是這個方面的菜鳥,有什么不對的地方大家噓之余給指出來唄。

    Stack context 的意圖就是為執行程序保存一個上下文,在需要的時候,可以回到這個上下文執行,包括異常,都可以更好地、統一地處理。這個功能的代碼不是很多,也比較清晰,但是文檔……嗯,至少我是沒看明白,結合 httpclient 的源碼作為例子,加上看 stack_context 的代碼,大概明白了是怎么用了。

    首先,在希望抓住問題的入口的地方要留住上下文:

     #......
     context = partial(self._cleanup, fail_callback = fail_callback)
     with stack_context.StackContext(context):
     getattr(c, cmd)(*args, **kwargs)

    這里,后面的執行內容,包括回調、觸發事件,都可以通過拋出異常退到這里,而管理異常的就是 context,這里,用 functools.partial 包裝了一下 _cleanup,_cleanup 的寫法大致是這樣的:

     @contextlib.contextmanager
     def _cleanup(self, fail_callback = None):
     try:
     yield
     except _Error as e:
     print "gotcha", e
     if fail_callback:
     fail_callback(e.args)

    這里,異常會被捕獲,并調用用戶指定的出錯回調函數進行處理。后面的代碼里,遇到故障,拋出異常就可以了,比如,可以用這個異常來返回超時:

     def _on_timeout(self, server):
     self._timeout = None
     server.mark_dead('Time out')
     raise _Error('memcache call timeout')

    這個異常是通過 io_loop 的 timeout 方法來觸發的:

     self._timeout = self.io_loop.add_timeout(
     time.time() + self.request_timeout,
     stack_context.wrap(partial(self._on_timeout, server)))

    這樣,就可以在異步程序里比較干凈地處理掉超時問題了。

    這個代碼對我這個水平的初學者還是比較晦澀的,大家可以參考下 HTTPClient 的源碼,等我把這個 memcached client 的代碼改完之后,也會放出來供參考指正的。

    —-

    update2: 放這里了?https://github.com/gnawux/tornado-memcache?, get 測試過,其他還沒有,另外,我不是多個 server sharding 的應用場景,相關的還沒測試。

    update :對于 timeout,設上了表忘了清除,如果是其他方式拋異常退出的話,也在拋異常的地方或者是最后處理異常的時候,把超時去掉

     if self._timeout is not None:
     self.io_loop.remove_timeout(self._timeout)
     self._timeout = None

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Tornado的stackcontext

    Tornado的stackcontext:按:本人 python 菜鳥,對 tornado 更沒什么研究,這兩天小擺弄了一下,記一下,有不對的還請指正 這兩天在用 tornado 做一個 memcached 的 proxy,作為一個 Python 的高性能異步框架,tornado (實際是 epoll/kqueue )的思想是——單線程+異
    推薦度:
    標簽: 本人 pytho 上下文
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 人人妻人人澡人人爽精品欧美| 四虎国产精品永久地址99新强| 成人国产精品一区二区视频 | 老司机亚洲精品影院| 久久久精品午夜免费不卡| 久久综合精品国产二区无码| 99精品国产成人一区二区| 国产微拍精品一区二区| 经典国产乱子伦精品视频| 久久精品中文字幕有码| 国产精品 综合 第五页| 国产欧美久久久精品| 大伊香蕉精品一区视频在线| 日韩精品人妻系列无码专区免费| 国产cosplay精品视频| 亚洲精品国产精品国自产观看| 2022精品天堂在线视频| 人妻少妇精品无码专区二区| 久久精品中文字幕第23页| 国产午夜精品久久久久九九| 8050免费午夜一级国产精品| 国产精品素人搭讪在线播放| 99精品久久精品一区二区| 2022精品天堂在线视频| 69久久精品无码一区二区| 97人妻无码一区二区精品免费| 久热精品视频第一页| 国产在线精品观看免费观看| 影视网欧洲精品| 中文字幕成人精品久久不卡| 日韩麻豆国产精品欧美| 午夜精品视频在线观看| 柠檬福利精品视频导航| 四虎精品影院4hutv四虎| 四虎国产精品永久地址49| 91精品国产高清久久久久久国产嫩草 | 亚洲?V无码乱码国产精品| 精品欧美小视频在线观看| 国产亚洲精品自在线观看| 国内精品久久久久久久久| 久久e热在这里只有国产中文精品99 |