從 Javascript 到 Python,看著asyncio讓我有點困惑。
作為對并發基本概念不熟悉的人,我只是假設對 Javascript 并發有一個膚淺的理解。
async / await在 Javascript 中使用的基本理解:
如果我們在async函式內部運行任何行程,以及函式await的回應,我們實際上是在等待函式在Promise.
完全有道理 - 當Promise給定一個值時,我們還可以使用回呼.then()來處理回應。或者,只是await.
無論此處異步性的底層實作是什么(例如,所有行程都在具有事件回圈的單個執行緒上運行),我們如何與之互動是否重要?
現在,我轉向 Python 并開始使用asyncio. 我們有Futures,就像Promises。突然之間,我無法使用我的標準庫,例如request.get(...),但我需要在庫中使用非阻塞網路請求,例如aiohttp.
阻塞/非阻塞在這里是什么意思?我認為這意味著事件回圈所在的單執行緒被阻塞,因此我們無法并行處理其他函式。
所以我的兩個問題是:
- 是什么導致單執行緒被阻塞?例如在
requests.get(...) - 為什么大多數函式在 Javascript 中是非阻塞的,但在 Python 中不是(即我們不需要特定的庫,例如
aiohttp)。
而關于語言什么喜歡Go他們goroutines?這是否只是一種情況,因為它是一種從一開始就內置并發性的新語言,不存在阻塞函式的概念。或者在 Go 中它不是單執行緒,所以一切都可以本質上并行化?
謝謝 :)
uj5u.com熱心網友回復:
事件回圈
Javascript 和 python 的異步 io 使用基于事件回圈的并發模型。
(注意復數,因為你可以有多個事件回圈來處理不同型別的任務,例如磁盤 io、網路 io、ipc、并行計算等)
事件回圈的一般概念是,你有很多事情要做,所以你把這些事情放在一個佇列中,每隔一段時間(比如每納秒),事件回圈從佇列中選擇一個事件,然后運行它一小會兒(可能是一毫秒左右),如果它沒有完成,要么將它推回佇列,要么等待直到它把控制權交還給事件回圈。
現在回答你的一些問題:
阻塞/非阻塞在這里是什么意思?我認為這意味著事件回圈所在的單執行緒被阻塞,因此我們無法并行處理其他函式。
阻塞事件回圈
阻塞事件回圈發生在事件回圈正在運行一個任務,并且任務沒有完成或將控制權交還給事件回圈,時間超過事件回圈安排它運行的時間。
在 python 的請求庫的情況下,他們使用同步 http 庫,它不考慮事件回圈;因此,在回圈中運行這樣的任務會使其他耐心等待輪到它們運行的??任務餓死,直到請求完成。
為什么大多數函式在 Javascript 中是非阻塞的,但在 Python 中不是(即我們不需要特定的庫,例如
aiohttp)。
JS
Javascript 中的一切都可以阻止事件回圈。不阻塞事件回圈的唯一方法是通過setTimeout大量使用回呼。但是,如果不小心,即使這些回呼運行時間過長,也可能會阻塞事件回圈,而不會通過另一個setTimeout呼叫將控制權交還給事件回圈。
(如果您從未使用過setTimeout,但在 JS 中使用過 promise 和異步網路請求,那么您可能正在使用一個可以使用的庫。瀏覽器中使用的大多數流行網路庫(ajax、axios、fetch 等) ),基于流行的XMLHttpRequestAPI,提供異步網路 IO。)
Python
在 python 中,情況略有不同:在 asyncio 之前,沒有“事件回圈”這樣的東西。在 python 解釋器繼續下一步之前,一切都必須運行完成。這是使 python 非常容易學習的部分原因(我敢說,創建......)。這樣做的原因是以 python GIL的形式出現的,簡單來說,它對任何 python 程式強制執行單一的執行順序。我鼓勵您單擊該鏈接,并閱讀 GIL 存在的原因。
而關于語言什么喜歡
Go他們goroutines?
注意:我不是圍棋程式員,但我讀過一些東西
Go 有什么不同?
The only difference between the way go handles goroutines and how python asyncio/js do their event loops, is that go makes more use of os threads to ensure that threads are scheduled fairly and make full use of the machine they run in.
While js callbacks/asyncio tasks will often run in the same thread as the event loop, goroutines are able to run in seperate OS threads and over multiple cores, thus giving them higher availability and higher parallelism. (In that case, we could almost consider goroutines to be closer to OS threads in terms of how much time they actually get to run, as compared to green threads which are bound by the amount of time the event loop's thread runs.)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318759.html
標籤:javascript Python 多线程 异步等待 蟒蛇异步
