精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python 協程與 JavaScript 協程的對比

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

[[424288]]

 前言

以前沒怎么接觸前端,對 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。 

  1. def foo():  
  2.     print("foo start")  
  3.     a = yield 1  
  4.     print("foo a", a)  
  5.     yield 2  
  6.     yield 3  
  7.     print("foo end")  
  8. gen = foo()  
  9. # print(gen.next())  
  10. # gen.send("a")  
  11. # print(gen.next())  
  12. # print(foo().next())  
  13. # print(foo().next())  
  14. # 在python3.x版本中,python2.x的g.next()函數已經更名為g.__next__(),使用next(g)也能達到相同效果。  
  15. # next()跟send()不同的地方是,next()只能以None作為參數傳遞,而send()可以傳遞yield的值.  
  16. print(next(gen))  
  17. print(gen.send("a"))  
  18. print(next(gen))  
  19. print(next(foo()))  
  20. print(next(foo()))  
  21. list(foo())  
  22. """  
  23. foo start  
  24.  
  25. foo a a  
  26.  
  27.  
  28. foo start  
  29.  
  30. foo start  
  31.  
  32. foo start  
  33. foo a None  
  34. foo end  
  35. """ 

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。 

  1. function* foo() {  
  2.     console.log("foo start")  
  3.     a = yield 1;  
  4.     console.log("foo a", a)  
  5.     yield 2;  
  6.     yield 3;  
  7.     console.log("foo end")  
  8.  
  9. const gen = foo();  
  10. console.log(gen.next().value); // 1  
  11. // gen.send("a") // http://www.voidcn.com/article/p-syzbwqht-bvv.html SpiderMonkey引擎支持 send 語法  
  12. console.log(gen.next().value); // 2  
  13. console.log(gen.next().value); // 3 
  14. console.log(foo().next().value); // 1  
  15. console.log(foo().next().value); // 1  
  16. /*  
  17. foo start  
  18.  
  19. foo a undefined  
  20.  
  21.  
  22. foo start  
  23.  
  24. foo start  
  25.  
  26. */ 

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 框架基于這個庫

例子 

  1. import asyncio  
  2. import time  
  3. async def exec():  
  4.     await asyncio.sleep(2)  
  5.     print('exec')  
  6. # 這種會和同步效果一直  
  7. # async def go():  
  8. #     print(time.time())  
  9. #     c1 = exec()  
  10. #     c2 = exec()  
  11. #     print(c1, c2)  
  12. #     await c1  
  13. #     await c2  
  14. #     print(time.time())  
  15. # 正確用法  
  16. async def go():  
  17.     print(time.time())  
  18.     await asyncio.gather(exec(),exec()) # 加入協程組統一調度 
  19.     print(time.time())  
  20. if __name__ == "__main__":  
  21.     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)。

當前執行棧執行完畢時會立刻先處理所有微任務隊列中的事件,然后再去宏任務隊列中取出一個事件。同一次事件循環中,微任務永遠在宏任務之前執行。

例子 

  1. var sleep = function (time) {  
  2.     console.log("sleep start")  
  3.     return new Promise(function (resolve, reject) {  
  4.         setTimeout(function () {  
  5.             resolve();  
  6.         }, time);  
  7.     });  
  8. };  
  9. async function exec() {  
  10.     await sleep(2000);  
  11.     console.log("sleep end")  
  12.  
  13. async function go() {  
  14.     console.log(Date.now())  
  15.     c1 = exec()  
  16.     console.log("-------1")  
  17.     c2 = exec()  
  18.     console.log(c1, c2)  
  19.     await c1;  
  20.     console.log("-------2")  
  21.     await c2;  
  22.     console.log(c1, c2)  
  23.     console.log(Date.now())  
  24. go();

event loop 將任務劃分:

  •  主線程循環從"任務隊列"中讀取事件
  •  宏隊列(macro task)js 同步執行的代碼塊,setTimeout、setInterval、XMLHttprequest、setImmediate、I/O、UI rendering等,本質是參與了事件循環的任務
  • 微隊列(micro task)Promise、process.nextTick(node環境)、Object.observe, MutationObserver等,本質是直接在 Javascript 引擎中的執行的沒有參與事件循環的任務

擴展閱讀 Node.js 中的 EventLoop (http://www.ruanyifeng.com/blog/2014/10/event-loop.html)

總結與對比

說明 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 關于事件循環的可比性更高些,這里還需需要繼續學習

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

 

責任編輯:龐桂玉 來源: 菜鳥學Python
相關推薦

2023-11-17 11:36:59

協程纖程操作系統

2025-06-26 04:10:00

2021-12-09 06:41:56

Python協程多并發

2024-02-05 09:06:25

Python協程Asyncio庫

2017-09-22 16:08:16

Python協程編程

2025-08-06 01:22:00

并發編程數據

2023-10-12 09:46:00

并發模型線程

2023-10-24 19:37:34

協程Java

2022-04-19 20:39:03

協程多進程

2025-02-08 09:13:40

2017-08-10 15:50:44

PHP協程阻塞

2017-06-15 13:15:39

Python協程

2024-06-27 07:56:49

2017-09-06 09:26:03

Python生成器協程

2021-04-25 09:36:20

Go協程線程

2022-09-06 20:30:48

協程Context主線程

2016-10-28 17:39:47

phpgolangcoroutine

2017-05-02 11:38:00

PHP協程實現過程

2020-11-29 17:03:08

進程線程協程

2023-08-08 07:18:17

協程管道函數
點贊
收藏

51CTO技術棧公眾號

国产日韩一区欧美| 日韩在线免费视频观看| 久久久噜噜噜www成人网| 国产日韩成人内射视频| 精品久久久免费视频| 在线视频精品| 日韩亚洲第一页| 亚洲一级Av无码毛片久久精品| 女生影院久久| 一二三四社区欧美黄| 欧美日韩国产精品一区二区| 国产色在线视频| 欧美专区在线| 欧美福利小视频| 呻吟揉丰满对白91乃国产区| 九九热hot精品视频在线播放| 欧美日韩在线观看一区二区 | 综合一区在线| 国产亚洲欧美aaaa| www国产视频| 91精品麻豆| 在线免费观看日本欧美| 日韩网站在线免费观看| 黄色片网站在线| 久久久夜色精品亚洲| 国产福利久久| a级片在线视频| 另类小说综合欧美亚洲| 情事1991在线| 国产主播在线观看| 一区二区三区毛片免费| 少妇高潮 亚洲精品| 国产成人无码精品久久二区三| 91精品啪在线观看国产手机 | 日韩在线不卡一区| videos性欧美另类高清| 午夜激情一区二区三区| 成人免费看片'免费看| 成年人黄视频在线观看| 国产精品日产欧美久久久久| 欧美日韩日本网| 婷婷婷国产在线视频| www.久久精品视频| 久久精品国产www456c0m| 亚洲色图在线观看| 我和岳m愉情xxxⅹ视频| 欧美黑白配在线| 亚洲成人av片| 亚洲综合自拍网| 欧美重口另类| 精品视频在线导航| 国产真实乱人偷精品| 红杏视频成人| 日韩av在线不卡| 好吊一区二区三区视频| 啪啪激情综合网| 亚洲乱码国产乱码精品精天堂| 强迫凌虐淫辱の牝奴在线观看| 国产精品乱战久久久| 日韩av在线天堂网| 成人影视免费观看| 精品高清在线| 日韩视频永久免费观看| 日本福利片在线观看| 午夜久久tv| 久久久久久久久网站| 国产一区二区三区影院| 久久久久国产一区二区| 国产精品久久久久国产a级| 亚洲视频在线免费播放| 国产最新精品免费| 国产91亚洲精品一区二区三区| 空姐吹箫视频大全| 久久综合九色综合欧美亚洲| 欧美一区二区影视| 日本高清中文字幕在线| 亚洲一二三四久久| 欧美日韩精品在线一区二区| 裤袜国产欧美精品一区| 欧美日韩电影在线| 亚洲美女高潮久久久| 欧美aaaaa级| 一区二区三区四区在线观看视频| 欧美做爰啪啪xxxⅹ性| 激情婷婷欧美| 国产精品99久久99久久久二8| 97人人爽人人爽人人爽| 风间由美性色一区二区三区四区 | 一区二区三区欧美在线观看| 国产成人生活片| 男人天堂视频在线观看| 欧美美女视频在线观看| 漂亮人妻被黑人久久精品| 精品国产91乱码一区二区三区四区 | 色综合久久66| 肉色超薄丝袜脚交| 五月天亚洲色图| 久久五月情影视| 亚洲欧美综合另类| 精品一区二区在线看| 精品视频一区在线| 精品欧美色视频网站在线观看| 亚洲国产综合91精品麻豆| 免费看黄色一级大片| 97久久精品| 色爱av美腿丝袜综合粉嫩av| 日本黄色片视频| 激情伊人五月天久久综合| 久久免费一区| √天堂8在线网| 欧美性色aⅴ视频一区日韩精品| 国产伦精品一区二区三区妓女下载| 在线日韩网站| 久久久久亚洲精品| 97国产成人无码精品久久久| 久久精品视频一区二区| 欧日韩免费视频| 在线欧美激情| 中文字幕欧美日韩va免费视频| 日本一区二区欧美| 国产乱码精品1区2区3区| 日韩三级电影免费观看| 高潮在线视频| 日韩视频免费直播| 大地资源高清在线视频观看| 久久天天综合| 精品一区二区三区视频日产| 视频在线观看入口黄最新永久免费国产 | 色中色在线视频| 国产精品国产三级国产普通话三级 | 日本黄色特级片| 日韩视频中文| 不卡视频一区| 欧美aaaaaaa| 欧美一区二区三区四区久久| 91av手机在线| 麻豆精品一区二区综合av| 欧洲国产精品| 亚洲一区二区三区四区| 国产视频在线观看一区二区| 香蕉免费毛片视频| 99视频精品在线| 免费拍拍拍网站| 果冻天美麻豆一区二区国产| 欧美华人在线视频| 国产手机精品视频| 亚洲视频免费看| 亚洲女人在线观看| 欧美国产高潮xxxx1819| 亚洲一区二区中文字幕| 99福利在线| 欧美精品一区二区久久久| 久久网中文字幕| fc2成人免费人成在线观看播放| 无码粉嫩虎白一线天在线观看 | 日日夜夜亚洲| 日韩在线播放视频| 国产精品污视频| 亚洲乱码精品一二三四区日韩在线| 一级做a爱视频| 欧美日韩网站| 精品国产乱码久久久久久88av| 爱啪啪综合导航| 日韩精品一二三四区| 天天爽夜夜爽人人爽| 欧美高清在线视频| 中文字幕在线视频一区二区三区| 欧美高清一区| 免费不卡亚洲欧美| 欧美日韩在线精品一区二区三区激情综合| 在线电影欧美日韩一区二区私密| 在线免费a视频| 亚洲激情在线激情| 少妇一级淫片免费放播放| 九九九伊在人线综合| 亚洲免费观看高清完整版在线| 欧美日韩一区二区区| 亚洲精华国产欧美| 欧美亚洲精品日韩| 91精品视频一区二区| 久久久天堂国产精品女人| 日本ー区在线视频| 91精品国模一区二区三区| xxxx 国产| 欧美国产精品一区二区| 欧洲成人午夜精品无码区久久| 在线亚洲一区| 一区二区三区四区五区视频 | 久久久久久a亚洲欧洲aⅴ| 国产极品一区| 国色天香2019中文字幕在线观看| 黄色影院在线播放| 欧美va日韩va| 中文字幕在线观看精品| 亚洲图片欧美综合| 欧美肥妇bbwbbw| 99re成人在线| 69久久精品无码一区二区| 久久久国产亚洲精品| 国产精品无码电影在线观看| 人人狠狠综合久久亚洲婷| 高清国产在线一区| 精品久久福利| 人体精品一二三区| 在线观看的网站你懂的| 在线视频欧美日韩精品| 亚洲精选一区二区三区| 欧美美女一区二区在线观看| 六月丁香婷婷综合| 亚洲自拍欧美精品| 一本一本久久a久久| 91免费看`日韩一区二区| 亚洲天堂一区二区在线观看| 日韩福利电影在线| 国产精品专区在线| 欧美性久久久| xxxxxx在线观看| 99国产**精品****| 婷婷久久五月天| 国产va免费精品观看精品视频 | 日韩一区二区在线| 免费毛片一区二区三区久久久| 91精品国产自产精品男人的天堂 | 97色在线观看免费视频| 国产精品一区二区小说| 色爱综合网欧美| 欧美乱偷一区二区三区在线| 国产成人夜色高潮福利影视 | 国产精品香蕉| 99视频在线| 久久天堂久久| 91视频国产一区| 四虎影视精品永久在线观看| 国产精品扒开腿做爽爽爽视频 | 色综合久久中文字幕| 日本网站在线免费观看| 亚洲午夜久久久久久久久久久| 91插插插插插插| 1区2区3区国产精品| 波多野结衣家庭教师在线观看| 久久伊99综合婷婷久久伊| 日韩一级视频在线观看| 久久综合久久综合久久| 中文精品在线观看| 久久久久久9999| 波多野结衣 在线| 久久精品综合网| 奇米网一区二区| 国产精品久久久99| 91杏吧porn蝌蚪| 一区二区三区精品在线观看| 国产亚洲精品码| 午夜精品久久久久久久| 亚洲欧美在线观看视频| 日韩欧美高清视频| 国产天堂第一区| 欧美日韩高清一区二区不卡| 国产日本精品视频| 精品久久久影院| 亚洲欧洲视频在线观看| 亚洲美女视频网| av在线资源站| 久久国产天堂福利天堂| 青青草视频在线免费直播| 97在线观看免费高清| 桃花岛tv亚洲品质| 国产精品尤物福利片在线观看| japansex久久高清精品| 91一区二区三区| 中文有码一区| 咪咪色在线视频| 亚洲久久成人| 美女网站视频黄色| 福利一区在线观看| 国产成人无码精品久久二区三| 国产精品久久久久一区| 国产大片中文字幕在线观看| 欧美日韩中国免费专区在线看| 99re热视频| 欧美va在线播放| 国产天堂在线| 欧美丰满少妇xxxxx| 91av亚洲| 亚洲一区二区三区四区不卡| 五月天精品在线| 艳妇臀荡乳欲伦亚洲一区| 日本熟女毛茸茸| 欧美一区二区三区免费观看视频| 无码精品人妻一区二区三区影院| 国产亚洲精品一区二区| 在线看一级片| 国产成人精品最新| 亚洲精品一区国产| 日韩久久精品一区二区三区| 亚洲国产一区二区在线观看| 欧美精品久久久久久久自慰| 麻豆视频一区二区| 欧美肉大捧一进一出免费视频 | 九九视频免费观看| 91久久精品一区二区| www.97av| 日韩在线观看av| 成人美女视频| 国产精成人品localhost| 日韩成人影院| 亚欧无线一线二线三线区别| 久久爱另类一区二区小说| 亚洲天堂资源在线| 亚洲青青青在线视频| 欧美性猛交xxxx乱大交hd| 精品人伦一区二区色婷婷| 视频免费一区| 青草成人免费视频| 国产精品美女在线观看直播| 日本一二三区视频在线| 日本91福利区| 国产交换配乱淫视频免费| 亚洲图片欧美色图| www.xxx国产| 菠萝蜜影院一区二区免费| 欧美精品高清| 久久精品一二三区| 在线成人www免费观看视频| 欧美高清精品一区二区| 中文字幕亚洲成人| 亚洲精品久久久久久久蜜桃| 精品香蕉在线观看视频一| heyzo高清国产精品| 999国产在线| 午夜激情一区| 日韩欧美中文视频| 亚洲欧美在线另类| 中文字幕欧美色图| 在线观看日韩视频| 三级成人在线| 欧美日韩一区综合| 久久婷婷一区| 精品人妻无码一区| 91黄色免费版| 国产69久久| 国产精品夜间视频香蕉| 欧美先锋资源| 永久免费的av网站| 日韩理论在线观看| 一区二区日韩视频| 久久久av网站| 美女精品久久| 亚洲精品蜜桃久久久久久| 成人午夜伦理影院| 精品国产乱码一区二区| 日韩av在线免费播放| 日韩福利一区| 亚洲成人在线视频网站| 国产精品美女在线观看直播| 欧美激情在线播放| 最新国产精品精品视频| 美脚丝袜脚交一区二区| 99久久国产综合精品女不卡| 国产精品人人人人| 国产一区二区三区直播精品电影 | 素人fc2av清纯18岁| 一本色道a无线码一区v| 成av人电影在线观看| 国产一区视频在线| 欧美午夜一区| 加勒比一区二区| 精品视频1区2区3区| 亚洲制服国产| 精品一卡二卡三卡四卡日本乱码| 水蜜桃久久夜色精品一区的特点| 肉色超薄丝袜脚交69xx图片| 精品国产99国产精品| 在线天堂资源| 综合一区中文字幕| 北条麻妃一区二区三区| 亚洲成人第一网站| 久久夜色精品国产| 日韩电影不卡一区| 国产精品区在线| 亚洲成a人片在线不卡一二三区| 精品美女视频在线观看免费软件| 成人黄色影片在线| 在线亚洲国产精品网站| 粉嫩精品久久99综合一区| 欧美sm美女调教| 亚洲成人一区在线观看| 欧美极品少妇无套实战| 久久久久久综合| 性猛交富婆╳xxx乱大交天津| 日本久久久久久久久| 欧美精品日本| 精品欧美一区二区久久久| 日韩欧美高清一区| 天堂久久午夜av| 日韩极品视频在线观看| 国产精品美女久久久久久久网站| 成人小说亚洲一区二区三区 | 91午夜精品| 亚洲怡红院在线| 色综合视频一区二区三区高清|