根據Wikipedia的說法,協程基于協作多任務處理,這使得它們比執行緒消耗更少的資源。沒有背景關系切換,沒有阻塞,沒有昂貴的系統呼叫,沒有臨界區等等。
換句話說,所有這些協程的好處似乎都來自于一開始就不允許多執行緒。這使得協程本質上是單執行緒的:實作了并發,但沒有真正的并行性。
這是真的嗎?是否可以通過使用多個執行緒來實作協程?
uj5u.com熱心網友回復:
協程允許在沒有多執行緒的情況下進行多任務處理,但它們不允許多執行緒。
在同時支持這兩種語言的語言中,可以在不同的執行緒中重新喚醒處于睡眠狀態的協程。
CPU 密集型任務的通常安排是擁有一個執行緒池,其執行緒數大約是 CPU 內核數的兩倍。然后使用該執行緒池同時執行可能數千個協程。執行緒共享一個準備執行的協程佇列,每當一個執行緒的當前協程阻塞時,它只會從佇列中獲取另一個協程來處理。
在這種情況下,您有足夠的繁忙執行緒來保持 CPU 忙碌,并且您仍然有執行緒背景關系切換,但它們的數量不足以浪費大量資源。協程背景關系切換的數量要高出數千倍。
uj5u.com熱心網友回復:
多個協程可以映射到單個 OS 執行緒。但是單個作業系統執行緒只能使用 1 個 CPU。因此,您需要多個作業系統執行緒來利用多個 CPU。
因此,如果協程調度程式需要使用多個 CPU(很可能),它需要使用多個 OS 執行緒。
查看 Go調度程式并尋找 MN 調度程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419764.html
標籤:
