摘要:譯者說(shuō)于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。
譯者說(shuō)
Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持Python2.6和Python3.2的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容?,F(xiàn)在網(wǎng)絡(luò)上還沒(méi)有Tornado4.3的中文文檔,所以為了讓更多的朋友能接觸并學(xué)習(xí)到它,我開(kāi)始了這個(gè)翻譯項(xiàng)目,希望感興趣的小伙伴可以一起參與翻譯,項(xiàng)目地址是tornado-zh on Github,翻譯好的文檔在Read the Docs上直接可以看到。歡迎Issues or PR。
異步和非阻塞I/O實(shí)時(shí)web功能需要為每個(gè)用戶提供一個(gè)多數(shù)時(shí)間被閑置的長(zhǎng)連接,在傳統(tǒng)的同步web服務(wù)器中,這意味著要為每個(gè)用戶提供一個(gè)線程,當(dāng)然每個(gè)線程的開(kāi)銷都是很昂貴的.
為了盡量減少并發(fā)連接造成的開(kāi)銷,Tornado使用了一種單線程事件循環(huán)的方式.這就意味著所有的應(yīng)用代碼都應(yīng)該是異步非阻塞的,因?yàn)樵谕粫r(shí)間只有一個(gè)操作是有效的.
異步和非阻塞是非常相關(guān)的并且這兩個(gè)術(shù)語(yǔ)經(jīng)常交換使用,但它們不是完全相同的事情.
阻塞一個(gè)函數(shù)在等待某些事情的返回值的時(shí)候會(huì)被 阻塞. 函數(shù)被阻塞的原因有很多:網(wǎng)絡(luò)I/O,磁盤I/O,互斥鎖等.事實(shí)上 每個(gè) 函數(shù)在運(yùn)行和使用CPU的時(shí)候都或多或少會(huì)被阻塞(舉個(gè)極端的例子來(lái)說(shuō)明為什么對(duì)待CPU阻塞要和對(duì)待一般阻塞一樣的嚴(yán)肅: 比如密碼哈希函數(shù)bcrypt, 需要消耗幾百毫秒的CPU時(shí)間,這已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)了一般的網(wǎng)絡(luò)或者磁盤請(qǐng)求時(shí)間了).
一個(gè)函數(shù)可以在某些方面阻塞在另外一些方面不阻塞.例如, tornado.httpclient 在默認(rèn)的配置下,會(huì)在DNS解析上面阻塞,但是在其他網(wǎng)絡(luò)請(qǐng)求的時(shí)候不阻塞(為了減輕這種影響,可以用 ThreadedResolver 或者是通過(guò)正確配置 libcurl 用 tornado.curl_httpclient 來(lái)做).在Tornado的上下文中,我們一般討論網(wǎng)絡(luò)I/O上下文的阻塞,盡管各種阻塞已經(jīng)被最小化了.
異步異步 函數(shù)在會(huì)在完成之前返回,在應(yīng)用中觸發(fā)下一個(gè)動(dòng)作之前通常會(huì)在后臺(tái)執(zhí)行一些工作(和正常的 同步 函數(shù)在返回前就執(zhí)行完所有的事情不同).這里列舉了幾種風(fēng)格的異步接口:
回調(diào)參數(shù)
返回一個(gè)占位符 (.Future, Promise, Deferred)
傳送給一個(gè)隊(duì)列
回調(diào)注冊(cè)表 (POSIX信號(hào))
不論使用哪種類型的接口, 按照定義 異步函數(shù)與它們的調(diào)用者都有著不同的交互方式;也沒(méi)有什么對(duì)調(diào)用者透明的方式使得同步函數(shù)異步(類似 gevent使用輕量級(jí)線程的系統(tǒng)性能雖然堪比異步系統(tǒng),但它們并沒(méi)有真正的讓事情異步).
例子一個(gè)簡(jiǎn)單的同步函數(shù):
from tornado.httpclient import HTTPClient def synchronous_fetch(url): http_client = HTTPClient() response = http_client.fetch(url) return response.body
把上面的例子用回調(diào)參數(shù)重寫的異步函數(shù):
from tornado.httpclient import AsyncHTTPClient def asynchronous_fetch(url, callback): http_client = AsyncHTTPClient() def handle_response(response): callback(response.body) http_client.fetch(url, callback=handle_response)
使用 Future 代替回調(diào):
from tornado.concurrent import Future def async_fetch_future(url): http_client = AsyncHTTPClient() 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 版本明顯更加復(fù)雜,但是 Futures 卻是Tornado中推薦的寫法.因?yàn)樗袃蓚€(gè)主要的優(yōu)勢(shì).首先是錯(cuò)誤處理更加一致,因?yàn)?Future.result 方法可以簡(jiǎn)單的拋出異常(相較于常見(jiàn)的回調(diào)函數(shù)接口特別指定錯(cuò)誤處理),而且 Futures 很適合和協(xié)程一起使用.協(xié)程會(huì)在后面深入討論.這里是上面例子的協(xié)程版本,和最初的同步版本很像:
from 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 (and 3.2)下人為執(zhí)行的, 因?yàn)樵谄渲猩善鞑辉试S返回值.為了克服這個(gè)問(wèn)題,Tornado的協(xié)程拋出一種特殊的叫 Return 的異常. 協(xié)程捕獲這個(gè)異常并把它作為返回值.在Python 3.3和更高版本,使用 return response.body 有相同的結(jié)果.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37658.html
摘要:譯者說(shuō)于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說(shuō) Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次...
摘要:譯者說(shuō)于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說(shuō) Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次...
閱讀 3015·2021-10-12 10:12
閱讀 3068·2021-09-22 16:04
閱讀 3300·2019-08-30 15:54
閱讀 2612·2019-08-29 16:59
閱讀 2926·2019-08-29 16:08
閱讀 878·2019-08-29 11:20
閱讀 3502·2019-08-28 18:08
閱讀 660·2019-08-26 13:43