黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 異步非阻塞io詳解

異步非阻塞io詳解

更新時(shí)間:2022-08-26 09:59:34 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1170次

Java基礎(chǔ)教程中大家會(huì)學(xué)到I/O的相關(guān)知識(shí),那么,異步非阻塞io是什么?動(dòng)力節(jié)點(diǎn)小編來為大家解答。

異步和非阻塞 I/O

實(shí)時(shí) Web 功能需要每個(gè)用戶的長(zhǎng)期空閑連接。在傳統(tǒng)的同步 Web 服務(wù)器中,這意味著為每個(gè)用戶分配一個(gè)線程,這可能非常昂貴。

為了最小化并發(fā)連接的成本,Tornado 使用單線程事件循環(huán)。這意味著所有應(yīng)用程序代碼都應(yīng)該以異步和非阻塞為目標(biāo),因?yàn)橐淮沃荒芗せ钜粋€(gè)操作。

術(shù)語異步和非阻塞密切相關(guān),經(jīng)常互換使用,但它們并不完全相同。

阻塞

當(dāng)一個(gè)函數(shù)在返回之前等待某事發(fā)生時(shí)會(huì)阻塞。一個(gè)函數(shù)可能會(huì)因?yàn)槎喾N原因而阻塞:網(wǎng)絡(luò) I/O、磁盤 I/O、互斥鎖等。事實(shí)上,每個(gè)函數(shù)在運(yùn)行和使用 CPU 時(shí)都會(huì)阻塞,至少有一點(diǎn)點(diǎn)阻塞(舉一個(gè)極端的例子來演示為什么 CPU 阻塞必須像其他類型的阻塞一樣受到重視,請(qǐng)考慮密碼散列函數(shù),如 bcrypt,其設(shè)計(jì)使用數(shù)百毫秒的 CPU 時(shí)間,遠(yuǎn)遠(yuǎn)超過典型的網(wǎng)絡(luò)或磁盤訪問)。

一個(gè)函數(shù)在某些方面可以是阻塞的,而在其他方面可以是非阻塞的。在 Tornado 的上下文中,我們通常在網(wǎng)絡(luò) I/O 的上下文中討論阻塞,盡管所有類型的阻塞都將被最小化。

異步

異步函數(shù)在完成之前返回,并且通常會(huì)在觸發(fā)應(yīng)用程序中的某些未來操作之前在后臺(tái)發(fā)生一些工作(與正常的 同步函數(shù)相反,它們會(huì)在返回之前完成它們將要做的所有事情)。異步接口有多種風(fēng)格:

回調(diào)參數(shù)

返回占位符 ( Future, Promise, Deferred)

交付到隊(duì)列

回調(diào)注冊(cè)表(例如 POSIX 信號(hào))

無論使用哪種類型的接口, 根據(jù)定義,異步函數(shù)與其調(diào)用者的交互方式不同;沒有免費(fèi)的方法可以以對(duì)其調(diào)用者透明的方式使同步函數(shù)異步(像gevent這樣的系統(tǒng)使用輕量級(jí)線程來提供與異步系統(tǒng)相當(dāng)?shù)男阅埽鼈儗?shí)際上并沒有使事情異步)。

Tornado 中的異步操作通常返回占位符對(duì)象 ( Futures),但一些低級(jí)組件(例如IOLoop使用回調(diào)的組件)除外。Futures通常使用awaitoryield 關(guān)鍵字轉(zhuǎn)換成它們的結(jié)果。

例子

這是一個(gè)示例同步函數(shù):

from tornado.httpclient import HTTPClient
def synchronous_fetch(url):
    http_client = HTTPClient()
    response = http_client.fetch(url)
    return response.body

這是作為原生協(xié)程異步重寫的相同函數(shù):

from tornado.httpclient import AsyncHTTPClient
async def asynchronous_fetch(url):
    http_client = AsyncHTTPClient()
    response = await http_client.fetch(url)
    return response.body

或者為了與舊版本的 Python 兼容,請(qǐng)使用以下tornado.gen模塊:

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

協(xié)程有點(diǎn)神奇,但它們?cè)趦?nèi)部做的事情是這樣的:

from tornado.concurrent import Future
def async_fetch_manual(url):
    http_client = AsyncHTTPClient()
    my_future = Future()
    fetch_future = http_client.fetch(url)
    def on_fetch(f):
        my_future.set_result(f.result().body)
    fetch_future.add_done_callback(on_fetch)
    return my_future

請(qǐng)注意,協(xié)程Future在 fetch 完成之前返回它。這就是使協(xié)程異步的原因。

任何你可以用協(xié)程做的事情,你也可以通過傳遞回調(diào)對(duì)象來做,但是協(xié)程提供了一個(gè)重要的簡(jiǎn)化,它讓你以與同步時(shí)相同的方式組織你的代碼。這對(duì)于錯(cuò)誤處理尤其重要,因?yàn)閠ry/except塊的工作方式與您在協(xié)程中所期望的一樣,而這很難通過回調(diào)實(shí)現(xiàn)。如果大家對(duì)此比較感興趣,想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容由淺到深,細(xì)致全面,適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助。

提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 麻豆视传媒短视频网站-欢迎您 | 深夜男人天堂 | 国产综合视频在线观看 | 日韩精品免费在线观看 | 香蕉视频一级 | 精品视频免费在线 | 人人天天夜夜 | 黄色片地址 | 久久福利影院 | 亚洲无线乱码高清在线观看一区 | 韩国午夜伦理 | 欧美成人免费看片一区 | 色偷偷91久久综合噜噜噜 | 涩涩视频在线观看入口 | 国产精品午夜波多野结衣性色 | 午夜精品aaa国产福利 | 亚洲国产精品久久久久久网站 | 精品国内自产拍在线视频 | 在线a人片免费观看高清 | 草草视频手机在线观看视频 | 国产成人高清精品免费观看 | 亚洲欧美在线中文字幕不卡 | 青草视频免费观看 | 国产日产久久高清欧美一区 | 成人香蕉视频 | 日本黄色片一级 | 国产欧美日韩另类va在线 | 琪琪午夜伦埋影院77 | 亚洲欧美日韩v中文在线 | www.av色| 韩国伦理片在线 | www.精品| 欧美色图亚洲综合 | 中国国产一级毛片视频 | 台湾中文娱乐综合久久久 | 3751性欧美视频在线播放 | 黄色成人在线网站 | 99ri在线视频网 | 久久窝窝国产精品午夜看15 | 男女深夜福利 | 天天做日日爱 |