在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python協程與JavaScript協程的對比及經驗技巧

馬哥Linux運維 ? 來源:從零開始的程序員生活 ? 作者:從零開始的程序員 ? 2021-10-20 14:30 ? 次閱讀

前言以前沒怎么接觸前端,對 JavaScript 的異步操作不了解,現在有了點了解。一查發現 Python 和 JavaScript 的協程發展史簡直就是一毛一樣!這里大致做下橫向對比和總結,便于對這兩個語言有興趣的新人理解和吸收。

共同訴求隨著 cpu 多核化,都需要實現由于自身歷史原因(單線程環境)下的并發功能

簡化代碼,避免回調地獄,關鍵字支持

有效利用操作系統資源和硬件:協程相比線程,占用資源更少,上下文更快

什么是協程?總結一句話,協程就是滿足下面條件的函數:

可以暫停執行(暫停的表達式稱為暫停點)

可以從掛起點恢復(保留其原始參數和局部變量)

事件循環是異步編程的底層基石

混亂的歷史Python 協程的進化

Python2.2 中,第一次引入了生成器

Python2.5 中,yield 關鍵字被加入到語法中

Python3.4 時有了 yield from(yield from 約等于 yield + 異常處理 + send), 并試驗性引入的異步 I/O 框架 asyncio(PEP 3156)

Python3.5 中新增了 async/await 語法(PEP 492)

Python3.6 中 asyncio 庫“轉正” (之后的官方文檔就清晰了很多)

在主線發展過程中,也出現了很多支線的協程實現如 Gevent。

deffoo():
print("foostart")
a=yield1
print("fooa",a)
yield2
yield3
print("fooend")


gen=foo()
#print(gen.next())
#gen.send("a")
#print(gen.next())
#print(foo().next())
#print(foo().next())

#在python3.x版本中,python2.x的g.next()函數已經更名為g.__next__(),使用next(g)也能達到相同效果。
#next()跟send()不同的地方是,next()只能以None作為參數傳遞,而send()可以傳遞yield的值.

print(next(gen))
print(gen.send("a"))
print(next(gen))
print(next(foo()))
print(next(foo()))

list(foo())

"""
foostart
1
fooaa
2
3
foostart
1
foostart
1
foostart
fooaNone
fooend
"""

JavaScript 協程的進化

  • 同步代碼

  • 異步 JavaScript: callback hell

  • ES6 引入 Promise/a+, 生成器 Generators(語法function foo(){}* 可以賦予函數執行暫停/保存上下文/恢復執行狀態的功能), 新關鍵詞 yield 使生成器函數暫停。

  • ES7 引入 async函數/await語法糖,async 可以聲明一個異步函數(將 Generator 函數和自動執行器,包裝在一個函數里),此函數需要返回一個 Promise 對象。await 可以等待一個 Promise 對象 resolve,并拿到結果

Promise 中也利用了回調函數。在 then 和 catch 方法中都傳入了一個回調函數,分別在 Promise 被滿足和被拒絕時執行,這樣就就能讓它能夠被鏈接起來完成一系列任務。總之就是把層層嵌套的 callback 變成 .then().then()...,從而使代碼編寫和閱讀更直觀。生成器 Generator 的底層實現機制是協程 Coroutine。
function*foo(){
console.log("foostart")
a=yield1;
console.log("fooa",a)
yield2;
yield3;
console.log("fooend")
}

constgen=foo();
console.log(gen.next().value);//1
//gen.send("a")//http://www.voidcn.com/article/p-syzbwqht-bvv.htmlSpiderMonkey引擎支持send語法
console.log(gen.next().value);//2
console.log(gen.next().value);//3
console.log(foo().next().value);//1
console.log(foo().next().value);//1

/*
foostart
1
fooaundefined
2
3
foostart
1
foostart
1
*/

Python 協程成熟體

可等待對象可以在 await 語句中使用,可等待對象有三種主要類型:協程(coroutine), 任務(task) 和 Future。

協程(coroutine)

  • 協程函數:定義形式為 async def 的函數;

  • 協程對象:調用 協程函數 所返回的對象

  • 舊式基于 generator(生成器)的協程

任務(Task 對象):

  • 任務 被用來“并行的”調度協程, 當一個協程通過 asyncio.create_task() 等函數被封裝為一個 任務,該協程會被自動調度執行

  • Task 對象被用來在事件循環中運行協程。如果一個協程在等待一個 Future 對象,Task 對象會掛起該協程的執行并等待該 Future 對象完成。當該 Future 對象 完成,被打包的協程將恢復執行。

  • 事件循環使用協同日程調度: 一個事件循環每次運行一個 Task 對象。而一個 Task 對象會等待一個 Future 對象完成,該事件循環會運行其他 Task、回調或執行 IO 操作。

  • asyncio.Task 從 Future 繼承了其除 Future.set_result() 和 Future.set_exception() 以外的所有 API

未來對象(Future):

  • Future 對象用來鏈接 底層回調式代碼 和高層異步/等待式代碼。

  • 不用回調方法編寫異步代碼后,為了獲取異步調用的結果,引入一個 Future 未來對象。Future 封裝了與 loop 的交互行為,add_done_callback 方法向 epoll 注冊回調函數,當 result 屬性得到返回值后,會運行之前注冊的回調函數,向上傳遞給 coroutine。

幾種事件循環(event loop):

  • libevent/libev:Gevent(greenlet + 前期 libevent,后期 libev)使用的網絡庫,廣泛應用;

  • tornado:tornado 框架自己實現的 IOLOOP;

  • picoev:meinheld(greenlet+picoev)使用的網絡庫,小巧輕量,相較于 libevent 在數據結構和事件檢測模型上做了改進,所以速度更快。但從 github 看起來已經年久失修,用的人不多。

  • uvloop:Python3 時代的新起之秀。Guido 操刀打造了 asyncio 庫,asyncio 可以配置可插拔的event loop,但需要滿足相關的 API 要求,uvloop 繼承自 libuv,將一些低層的結構體和函數用 Python 對象包裝。目前 Sanic 框架基于這個庫

例子

importasyncio
importtime


asyncdefexec():
awaitasyncio.sleep(2)
print('exec')

#這種會和同步效果一直
#asyncdefgo():
#print(time.time())
#c1=exec()
#c2=exec()
#print(c1,c2)
#awaitc1
#awaitc2
#print(time.time())

#正確用法
asyncdefgo():
print(time.time())
awaitasyncio.gather(exec(),exec())#加入協程組統一調度
print(time.time())

if__name__=="__main__":
asyncio.run(go())

JavaScript 協程成熟體

Promise 繼續使用

Promise 本質是一個狀態機,用于表示一個異步操作的最終完成 (或失敗), 及其結果值。它有三個狀態:
  • pending: 初始狀態,既不是成功,也不是失敗狀態。
  • fulfilled: 意味著操作成功完成。
  • rejected: 意味著操作失敗。
最終 Promise 會有兩種狀態,一種成功,一種失敗,當 pending 變化的時候,Promise 對象會根據最終的狀態調用不同的處理函數。

async、await語法糖

async、await 是對 Generator 和 Promise 組合的封裝,使原先的異步代碼在形式上更接近同步代碼的寫法,并且對錯誤處理/條件分支/異常堆棧/調試等操作更友好。

js 異步執行的運行機制

  1. 所有任務都在主線程上執行,形成一個執行棧。

  2. 主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。

  3. 一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列"。那些對應的異步任務,結束等待狀態,進入執行棧并開始執行。

遇到同步任務直接執行,遇到異步任務分類為宏任務(macro-task)和微任務(micro-task)。當前執行棧執行完畢時會立刻先處理所有微任務隊列中的事件,然后再去宏任務隊列中取出一個事件。同一次事件循環中,微任務永遠在宏任務之前執行。

例子

varsleep=function(time){
console.log("sleepstart")
returnnewPromise(function(resolve,reject){
setTimeout(function(){
resolve();
},time);
});
};

asyncfunctionexec(){
awaitsleep(2000);
console.log("sleepend")
}

asyncfunctiongo(){
console.log(Date.now())
c1=exec()
console.log("-------1")
c2=exec()
console.log(c1,c2)
awaitc1;
console.log("-------2")
awaitc2;
console.log(c1,c2)
console.log(Date.now())
}

go();

event loop 將任務劃分:

  • 主線程循環從"任務隊列"中讀取事件

  • 宏隊列(macro task)js 同步執行的代碼塊,setTimeout、setInterval、XMLHttprequest、setImmediate、I/O、UI rendering等,本質是參與了事件循環的任務

  • 微隊列(micro task)Promise、process.nextTick(node環境)、Object.observe, MutationObserver等,本質是直接在 Javascript 引擎中的執行的沒有參與事件循環的任務

總結與對比

說明 python JavaScript 點評
進程 單進程 單進程 一致
中斷/恢復 yield,yield from,next,send yield,next 基本相同,但 JavaScript 對 send 沒啥需求
未來對象(回調包裝) Futures Promise 解決 callback,思路相同
生成器 generator Generator 將 yield 封裝為協程Coroutine,思路一樣
成熟后關鍵詞 async、await async、await 關鍵詞支持,一毛一樣
事件循環 asyncio 應用的核心。事件循環會運行異步任務和回調,執行網絡 IO 操作,以及運行子進程。asyncio 庫支持的 API 較多,可控性高 基于瀏覽器環境基本是黑盒,外部基本無法控制,對任務有做優先級分類,調度方式有區別 這里有很大區別,運行環境不同,對任務的調度先后不同,Python 可能和 Node.js 關于事件循環的可比性更高些,這里還需需要繼續學習

到這里就基本結束了,看完不知道你會有什么感想,如有錯誤還請不吝賜教。

原文鏈接:https://www.cnblogs.com/lgjbky/p/14759463.html

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11049

    瀏覽量

    216147
  • JAVA
    +關注

    關注

    20

    文章

    2986

    瀏覽量

    107067
  • 函數
    +關注

    關注

    3

    文章

    4372

    瀏覽量

    64306
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70309
  • 生成器
    +關注

    關注

    7

    文章

    322

    瀏覽量

    21723

原文標題:Python 協程與 JavaScript 協程的對比

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    請問NICE處理器與傳統ocb外設相比的優勢有什么?

    使用擴展指令調用NICE處理器完成預定操作,給出的優勢通常為代替CPU處理數據,但其實使用片上總線掛一個外設,然后驅動外設完成操作也可以實現相同的功能,所以想問一下處理器相比于外設實現還有沒有其它方面的優勢
    發表于 05-29 08:21

    NICE處理器與傳統ocb外設相比的優勢有什么?

    使用擴展指令調用NICE處理器完成預定操作,給出的優勢通常為代替CPU處理數據,但其實使用片上總線掛一個外設,然后驅動外設完成操作也可以實現相同的功能,所以想問一下處理器相比于外設實現還有沒有其它方面的優勢
    發表于 05-28 08:31

    LuatOS深度解析:小白也能10分鐘學會,代碼效率直接起飛!

    嵌入式開發如何兼顧效率與簡潔?LuatOS給出完美答案!它用類線程的語法封裝異步邏輯,讓多任務開發像單線程一樣簡單。本文用圖文并茂的方式拆解原理,10分鐘帶你輕松入門! ? L
    的頭像 發表于 04-10 15:23 ?141次閱讀
    LuatOS<b class='flag-5'>協</b><b class='flag-5'>程</b>深度解析:小白也能10分鐘學會,代碼效率直接起飛!

    10分鐘上手寫代碼,LuatOS輕松掌握!

    10分鐘學會LuatOS,從此你的程序也能像通勤族利用碎片時間一樣游刃有余。現在就去動手試一試,開啟異步編程新體驗! 寫給第一次聽說的你?: 別怕!
    的頭像 發表于 04-10 15:18 ?212次閱讀
    10分鐘上手寫代碼,LuatOS<b class='flag-5'>協</b><b class='flag-5'>程</b>輕松掌握!

    電機沖刺北交所上市

    近日,北交所網站顯示,常州三電機股份有限公司(以下簡稱“三電機”)答復了第二輪問詢函。三電機此前于2023年12月29日IPO申請獲北交所受理。
    的頭像 發表于 03-28 17:53 ?1087次閱讀

    進程、線程、傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    ;) ? asyncio.run(main()) 輸出結果: markdown 抓取完成!共 10 條數據 「三大門派」終極對比表(含「社死」現場) 特性 進程 線程 資源開銷 高(買房) 中(合租
    發表于 03-26 09:27

    FS-MCore-F800E STM32例

    FS-MCore-F800E STM32例
    發表于 11-18 15:10 ?0次下載

    使用TMS320C6416處理器:Turbo處理器(TCP)

    電子發燒友網站提供《使用TMS320C6416處理器:Turbo處理器(TCP).pdf》資料免費下載
    發表于 10-23 10:16 ?0次下載
    使用TMS320C6416<b class='flag-5'>協</b>處理器:Turbo<b class='flag-5'>協</b>處理器(TCP)

    使用TMS320C6416處理器:Viterbi處理器(VCP)

    電子發燒友網站提供《使用TMS320C6416處理器:Viterbi處理器(VCP).pdf》資料免費下載
    發表于 10-21 09:36 ?0次下載
    使用TMS320C6416<b class='flag-5'>協</b>處理器:Viterbi<b class='flag-5'>協</b>處理器(VCP)

    安達發|APS高級排高級物料需求計劃

    APS高級排高級物料需求計劃是在制造業中非常重要的概念。它們分別涉及到生產計劃和物料管理,對于提高生產效率、降低成本和滿足客戶需求具有重要意義。下面我將詳細介紹這兩個概念及其在實際生產
    的頭像 發表于 09-25 17:49 ?575次閱讀
    安達發|APS高級排<b class='flag-5'>程</b>高級物料需求計劃

    基于APS排系統的PDM功能

    APS系統(AdvancedPlanningandScheduling,先進計劃與排)是一種基于APS系統(AdvancedPlanningandScheduling,先進計劃與排)是一種
    的頭像 發表于 09-21 16:53 ?551次閱讀
    基于APS排<b class='flag-5'>程</b>系統的PDM功能

    國內APS高級排軟件的全面解析

    在現代制造業和物流行業中,高效的生產計劃和庫存管理是企業提升競爭力的關鍵。隨著信息技術的發展,高級排軟件(AdvancedPlanningandScheduling,APS)成為了企業優化資源配置
    的頭像 發表于 09-21 16:49 ?796次閱讀
    國內APS高級排<b class='flag-5'>程</b>軟件的全面解析

    晶泰科技與鑫集團簽署戰略合作協議

    近日,在蘇州鑫能源中心,晶泰科技與鑫集團共同見證了雙方戰略合作新篇章的開啟,正式簽署了為期五年的戰略合作協議。此次合作,不僅標志著兩大行業巨頭的強強聯合,更預示著新能源材料研發領域將迎來一場由人工智能與自動化技術引領的深刻變革。
    的頭像 發表于 09-03 14:34 ?760次閱讀

    聲學測試掃頻信號倍頻頻點計算(SoundCheck)

    聲學測試中,經常需要用到激勵信號,不管是測試揚聲器還是麥克風,通常是輸出一個標準信號源,然后采集信號與標準信號進行對比,以測試待測產品性能,標準音頻可以有多種,參考Soundcheck 軟件,如
    發表于 08-01 10:58

    求CS32A039例

    求CS32A039例,郵箱:448789893@qq.com
    發表于 07-31 16:54
    主站蜘蛛池模板: 最新色视频 | 一本大道香蕉大vr在线吗视频 | 黄色成人免费观看 | 狠狠色婷婷七月色综合 | 一级毛片免费毛片一级毛片免费 | 国产福利精品视频 | 神马午夜98 | 免费大片黄日本在线观看 | 黄网站色成年片大免费软件 | 熊出没之环球大冒险旧版免费观看 | 国产成人a一区二区 | 黄色一级片网址 | 欧美色欧美亚洲高清在线观看 | 欧美一欧美一区二三区性 | 222www免费观看 | 苦瓜se影院在线视频网站 | 网www天堂资源在线 网红和老师啪啪对白清晰 网络色综合久久 | 中出丰满大乳中文字幕 | 亚洲人成在线精品不卡网 | 婷婷激情视频 | 天天视频免费观看高清影视 | 日本高免费观看在线播放 | 日日操夜夜 | 欧美一级片观看 | 精品女视频在线观看免费 | 婷婷九月 | 巨乳色网址 | 午夜视频啪啪 | 午夜国产精品免费观看 | 免费a级毛片出奶水 | 天堂69亚洲精品中文字幕 | 日本美女黄色一级片 | 99久久免费精品视频 | 亚洲成人99| 国产1区二区 | 天天摸天天操天天爽 | 天天舔夜夜操 | 成人a级特黄毛片 | 天天视频天天爽 | 69xxxxtube日本免费 | 免费看黄视频网站 |