tornado 第一篇

?一:異步和非阻塞IO

  實時的web特性通常需要每個用戶一個大部分時間,在傳統的同步web服務器中,這意味著需要給每個用戶分配一個專用的線程,這樣的開銷是十分巨大

  tornado使用啦一種單線程事件循環的方式,這意味著所有的應用代碼都應該是異步和非阻塞的,因為在同一時刻只有一個操作是有效的

  1,阻塞

    一個函數在等到返回值等都是阻塞的,

    一個函數可以在某些方面阻塞而在其他方面不阻塞,舉例說明。tornado,httpclient在默認設置下講阻塞與DNS解析,但是在其他網絡請求時不會阻塞(為了減輕這種影響,可以用ThreadeResolver 或通過正確配置libcurl使用tornado.curl_htpclient),在Tornado的上下文中我們通常討論網絡I/O上下文阻塞,雖然各種阻塞已經被最小化啦

  2,異步

    一個異步函數在在它結束前就已經返回啦,而且通常會在程序中觸發一些動作然后在后頭執行一些任務,這里有幾種類型的異步接口

    1,回調函數

    2,返回一個占位符(Future,Promise,Deferred)

    3,傳送一個隊列

    4,回調注冊

    一個簡單的同步異步函數

    

from tornado.httpclient import HTTPClient
from tornado.concurrent import Future
def synchronous_fetch(url):http_client = HTTPClient()def handle_response(response):callback(response.body)http_client.fetch(url,callbace=handle_response)

    在一次通過Future替代回調函數

    

def async_fetch_future(url):http_client=HTTPClient()my_future=Future()fetch_future=http_client.fetch(url)fetch_future.add_done_callback(lambda f:my_future.set_result(f.result))return my_future

    原始的Future是很復雜的,但是Futures是tornado中推薦使用的一種做法,因為他有兩個優勢

    錯誤處理是通過Future.result 函數可以簡單拋出一個異常,還有就是攜程兼容比較好

   

rom tornado import gen@gen.coroutine
def fetch_coroutine(url):http_client = AsyncHTTPClient()response = yield http_client.fetch(url)raise gen.Return(response.body)

    語句?raise?gen.Return(response.body)?在 Python 2 中是人為設定的, 因為生成器不允許又返回值. 為了克服這個問題, Tornado 協程拋出了一個叫做?Return?的特殊異常. 協程將會像返回一個值一樣處理這個異常.在 Python 3.3+ 中,?return?response.body?將會達到同樣的效果.

?

二:協程

  tornado中推薦協程來編寫異步代碼,協程使用python中關鍵件yield替換鏈式回調實現掛起和繼續協程的執行(像在gevent中使用輕量級線程合作的方法有時也稱作為協程,但是在Tornado中所有的協程使用異步函數來實現明確的上下文切換)

  看下協程的代碼

from tornado import gen
from tornado import HTTPClient
def fetch_coroutie(url):http_client=AsyncHTTPClient() 
  respone=yield http_client.fetch(url)

  # raise gen.Return(respone.body)
  
  return respone.body

?

   python3.5 async和awiat 

   python3.5 引入啦async和await 從tornado4.3開始,在協程基礎上你可以使用這個來代替yield,簡單的通過使用async def foo()來替代 @gen.coroutine 裝飾器,用await來代替yield,可以看下下面的例子

  

async def fetch_coroutine(url):http_client = AsyncHTTPClient()response = await http_client.fetch(url)return response.body

    一個含有yield的函數時是一個生成器,所有的生成器都是異步的,調用它時將會返回一個對象而不是將函數運行完成,@gen.coroutine修飾器通過yeild表達式通過產生一個Future對象和生成器進行通信

    可以看下一個協程裝飾器內部循環的簡單版本

    

def run(self):future=self.gen.send(self.next)def callback(f):self.next=f.result()self.run()future.add_done_callback(callback)

    

有時你并不想等待一個協程的返回值. 在這種情況下我們推薦你使用?IOLoop.spawn_callback, 這意味著?IOLoop?負責調用. 如果它失敗了,?IOLoop?會在日志中記錄調用棧: ?同時注意spawn_callback調用的函數,也必須是協程函數

# The IOLoop will catch the exception and print a stack trace in
# the logs. Note that this doesn't look like a normal call, since
# we pass the function object to be called by the IOLoop.
IOLoop.current().spawn_callback(divide, 1, 0)


  協程模式
   1,結合callbacks
      
為了使用回調來代替Future與異步代碼進行交互,將這個調用裝在task中,這將會在你生成的Future對象中添加一個回調參數
      
@gen.coroutine
def call_task():yield gen.Task(some_function, other_args)#把yeild換成gen_Task  

     2,調用阻塞函數

      在協程中調用阻塞函數的最簡單方法是使用ThreadPoolExecutor ?這將返回與協程兼容的Futures

      

thread_pool = ThreadPoolExecutor(4)@gen.coroutine
def call_blocking():yield thread_pool.submit(blocking_func, args)

      3,并行

        協程裝飾器識別列表或者字典中的Futures,并且并行等待這些Fuures

    

@gen.coroutine
def parallel_fetch(url1,url2):resp1,resp2 = yield [http_client.fetch(url1),http_client.fetch(url2)]@gen.coroutine
def parallel_fetch_dict(urls):responses = yield {url: http_client.fetch(url)for url in urls}

      4,交叉存取技術(項目一般用到比較多)

        有時保存一個Future比立刻yield它更有用,你可以等待它之前執行其他操作

        

def get(self):fetch_future = self.fetch_next_chunk()while True:chunk = yield fetch_futureif chunk is None:breakself.write(chunk)fetch_future= self.fetch_next_chunk()yield self.flush()

      5,循環

        因為python無法使用forwhile循環yield迭代器,并且捕獲yield的返回結果,相反,你需要將循環和訪問結果區分開來,

      

import motor
db = motor.MotorClient().test@gen.coroutine
def loop_example(collection):cursor = db.collection.find()while (yield cursor.fetch_next):doc = cursor.next_object()

      6,在后臺運行

@gen.coroutine
def minute_loop():while True:yield do_something()yield gen.sleep(60)# Coroutines that loop forever are generally started with
# spawn_callback().
IOLoop.current().spawn_callback(minute_loop)

?

?

更過內容可以參考:http://tornado-zh-cn.readthedocs.io/zh_CN/latest/guide/coroutines.html#python-3-5-async-await

        

?

    

  

?

轉載于:https://www.cnblogs.com/1204guo/p/8533421.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最近找工作面的面試題目匯總(一)

網址:http://www.cnblogs.com/renyiqiu/p/6504839.html 目錄 1.抽象類的介紹,抽象類里的虛函數和抽象函數 參考文檔抽象類特征抽象方法特征2.虛函數和抽象方法 參考文檔虛方法的特點虛方法(virtual)和抽象方法(abstract)的區別3.靜態類和靜態類成員 參考…

你認識的C# foreach語法糖,真的是全部嗎?

本文的知識點其實由golang知名的for循環陷阱發散而來, 對應到我的主力語言C#, 其實牽涉到閉包、foreach。為了便于理解,我重新組織了語言,以倒敘結構行文。先給大家提煉出一個C#題:觀察for、foreach閉包的差異左邊輸出…

C#對window 硬件類操作,ManagementObjectSearcher

原文轉載:http://blog.csdn.net/da_keng/article/details/50589145 純屬轉載,復制過來方便編程時尋找。感謝作者:I-Awakening復制前補充: 在剛學C#,用ManagementObjectSearcher 竟然不能解析到頭文件,需要手…

2018第51周日

從人們開始用電腦開始就面臨著文件版本控制的問題,從最原始的同一個文檔多個不同命名表示版本到使用本地的文件版本管理,到后面集中式版本管理如2000年的SVN,到再后來的分布式的版本控制系統,如2005年的Git。到現在用的最多的版本…

twitter批量取消關注_如何在Twitter上取消阻止“潛在敏感內容”

twitter批量取消關注Twitter推特Twitter blocks some tweets with a “potentially sensitive content” warning. You can disable this warning—even on an iPhone or iPad, where the option isn’t normally available. You can also disable sensitive content warnings …

mysql數值類型總結及常用函數

最近在學習下,總結一下mysql數值類型; mysql字符類型分: 1、整數類型: 字節 值范圍 INTERGER 1 -127-128 SMALLINT 2 MEDIUMINT…

Semantic-UI的React實現(二):CSS類構造模塊

更簡單的類名標簽 Semantic-UI使用了更簡單的類名聲明。用過Bootstrap的同學都會被其復雜的類名標簽折磨過&#xff0c;例如一個簡單的按鍵樣式&#xff0c;不論顏色或是大小&#xff0c;都需要btn-前綴聲明&#xff1a; <button type"button" class"btn btn…

skype自動回復_如何在Windows 10上阻止Skype自動啟動

skype自動回復Microsoft微軟The Skype app included with Windows 10 now has a notification area icon. That’s great, but what if you never use Skype and don’t want it starting every time you sign in? Here’s how to get rid of it. Windows 10隨附的Skype應用程…

Vue 組件實例屬性的使用

前言 因為最近面試了二、三十個人&#xff0c;發現大部分都還是只是停留在 Vue 文檔的教程。有部分連教程這部分的文檔也沒看全。所以稍微寫一點&#xff0c;讓新上手的 Vuer 多了解 Vue 文檔的其他更需要關注的點。 因為 Vue 文檔已經是個很成熟的文檔&#xff0c;并且實現的 …

C# 讀取硬盤信息類

在編寫工具檢查硬盤信息時&#xff0c;總結常用到的類&#xff1a; Win32_DiskDrive 這個用了檢查整個硬盤的信息&#xff0c;如果電腦只有一個硬盤&#xff0c;那只顯示一條信息。參考如下代碼&#xff0c;AddTextBox為自定義顯示函數。&#xff08;MSDN class 查詢&#xff1…

95后滬漂女孩深陷“狠”且“卷”職場,向上思維,永不過時!

hi&#xff0c;這里是桑小榆。最近和一個伙伴oncall了很久&#xff0c;對我的文章以及思想轉變產生了很大的共鳴&#xff0c;她向我分享了一些職場經歷還有成長經歷等&#xff0c;她的這些經歷也讓我引發了一定的思考。光光&#xff0c;最近剛升任了部門主管&#xff0c;對于當…

PHP:6種GET和POST請求發送方法

在i94web博客中&#xff0c;我試過了暢言和多說兩種社會化評論框&#xff0c;后來還是拋棄了暢言&#xff0c;不安全。 無論是暢言還是多說&#xff0c;我都需要從遠程抓取文章的評論數&#xff0c;然后存入本地數據庫。對于多說&#xff0c;請求的格式如下&#xff1a; // 獲取…

解決Ubuntu 16.04下提示boot分區空間不足的辦法

原文地址: http://www.jb51.net/article/106976.htm   https://www.linuxidc.com/Linux/2015-09/123227.htm 因為linux內核一直在更新&#xff0c;更新后&#xff0c;舊的內核就不在使用&#xff0c;但舊的內核文件還在boot里面&#xff0c;占據著空間&#xff0c;更新幾次過…

3d鏡頭 適配_您是否應該將鏡頭適配器與無反光鏡相機一起使用?

3d鏡頭 適配Canon佳能Mirrorless cameras aren’t the future, they’re the present. If you’re switching from an older DSLR, though, the obvious thing to do is just buy an adapter so you can keep using your old gear. 無反光鏡相機不是未來&#xff0c;而是現在。…

C#彈窗提示并自動關閉方法

剛學C#不久&#xff0c;就寫個工具&#xff0c;總結寫一個簡便自定義提示窗口方法&#xff0c;并自動關閉。 1.在項目添加windows form&#xff08;非user control&#xff09;&#xff0c;命名為Form_wait。 2.在Form_wait,加入需要控件與一個定時器timer1。 數字10為計時顯…

dotNET 7:最小 API 使用

最小 API 并不是在 .NET 7 中才加入的&#xff0c;記得應該是在 .NET 6 中就已經提供&#xff0c;只是對我來說&#xff0c;到現在才開始使用。創建一個最小 API在 VS 2022 中創建 WebAPI 項目&#xff0c;不勾選使用控制器&#xff0c;創建出來的就是最小 API &#xff1a;不勾…

Taro小程序采坑記

Taro&#xff0c;京東凹凸實驗室出品的適配多端的一個框架&#xff0c; Taro 是一套遵循 React 語法規范的 多端開發 解決方案。現如今市面上端的形態多種多樣&#xff0c;Web、React-Native、微信小程序等各種端大行其道&#xff0c;當業務要求同時在不同的端都要求有所表現的…

struts入門

struts工作過程&#xff1a; 反射代碼&#xff1a; Class clazz Class.forName("action全路徑"); Method m clazz.getMethod("execute"); Object o m.invoke(); package標簽&#xff1a; 轉發&#xff1a;地址欄不變 修改struts默認常量值&#xff1a; 常…

《Android應用開發攻略》——2.14 備份Android應用程序數據

2.14 備份Android應用程序數據 Pratik Rupwal2.14.1 問題當用戶恢復出廠設置或者改用新的Android設備時&#xff0c;應用程序丟失存儲數據或者應用程序設置。2.14.2 解決方案Android的Backup Manager&#xff08;備份管理器&#xff09;能夠在應用程序重新安裝時自動恢復備份數…

C#程序開機啟動與獲取程序啟動路徑

寫windows工具時&#xff0c;要進行電源管理&#xff0c;需要重啟與開關機OS&#xff0c;這樣工具就需要自動啟動。查了網上很多資料&#xff0c;修改注冊列表就可以。 但是&#xff0c;復制幾個網站的代碼并自己修改都發現不行&#xff0c;最后發現腳本之家這段代碼才成功&am…