我讀過各種文章和類似的問題,我知道這兩個概念是不同的,但我似乎不知道正確的答案。
我理解這thread是就工人數量而言,sync/async是就任務順序而言。想問一下我的理解是否正確,舉個例子。
必須做三明治。
- 烤面包。
- 煎雞蛋。
- 結合。
一根線==一個煎鍋。
- 單執行緒和同步:
- 把面包放在煎鍋上。
- 等面包烤好了。
- 面包烤好后,把面包從鍋里拿出來,把雞蛋放在鍋里。
- 多執行緒和異步:
- 多個平底鍋。
- 將面包和雞蛋分別放在不同的平底鍋上。
- 不管你先放什么,取出完成的一個。
- 單執行緒和異步:
- 一鍋。
- 把面包放在烤盤上。
- 面包還沒有烤好,而是先放在一邊,然后把雞蛋放在那個平底鍋上。
- 雞蛋不是全炸的,我就把它們收起來,把面包放在平底鍋上。
- 重復...
- 多執行緒和同步:
- 有幾個平底鍋,但我們先在 pan1 上烤面包。
- 當pan1上的面包烤好后,在pan2上煎雞蛋。
我的理解正確嗎?
) 如果是這樣的話,像javascript這樣的單執行緒/異步,事件回圈中的任務只是在佇列中等待并且沒有進行,對吧?
uj5u.com熱心網友回復:
這個例子很好很有趣。不要忘記稍后將另一個用于“多執行緒和異步”,否則它會被燒毀;)。否則,對我來說總體上似乎是正確的。
不過,這個例子對于“單執行緒和異步”的情況不是很好,它可能是混亂的根源。在實踐中,搶占(雞蛋和面包之間的切換)不能保證異步。一般是合作完成的。問題是,在您的示例中,由于只有 1 個平底鍋,因此無法在雞蛋煮熟時煮面包。在實踐中,像 I/O 操作這樣的任務可以在不使用任何內核(即平移)的情況下進行。
異步主要用于避免等待任務完成而可以完成其他事情。它對于計算任務并不是很有用。例如,如果您為 2 個朋友做 2 個三明治,但您不知道他們喜歡雞蛋還是信標,您需要詢問他們。這個任務可以是異步的:你可以問第一個,然后是第二個,然后用 1 或 2 個平底鍋煮面包,然后在煮雞蛋/信標之前檢查答案。如果沒有異步,您必須在烹飪面包之前等待答案(可能在執行緒中)(效率不高)。
異步操作可以分成多個部分:
- 開始請求(例如,向朋友發送訊息)
- 檢查狀態或觸發事件(例如檢查您的朋友訊息或在收到時對其作出反應)
- 完成請求(例如,開始準備你朋友想要的東西),其中可以包括開始新的請求(在 1 中完成)
第 2 部分取決于語言/框架。此外,關于語言/框架,有時有一部分是等待任務完成(阻塞操作)。它可以通過回圈第 2 部分直到狀態完成來完成,但有時它可以更有效地完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471669.html
