『單』線程能實現(xiàn)『并發(fā)』嗎?
多線程可以實現(xiàn)并發(fā)是毋庸置疑的,但是單線程是否能實現(xiàn)并發(fā)呢?
這就像我們知道多個人肯定可以同時做多件事,然后有人問一個人可以同時做多件事嗎?答案當然也是可以。比如很多人就經常邊吃飯邊玩手機,在工作中一個人也經常被上級同時安排大大小小多個任務。線程也是同理,所以單線程可以實現(xiàn)并發(fā)。
看到有人在也是回答“能”的情況下,說單線程實現(xiàn)的并發(fā)是“偽并發(fā)”,個人覺得這種說法是有問題的。并發(fā)就是并發(fā),并不存在所謂“偽并發(fā)”。我大概也能猜到提出“偽并發(fā)”概念的人的意思,他認為的“真并發(fā)”其實是“并行”,其認為無法實現(xiàn)并行的并發(fā)就是“偽并發(fā)”。
但是,在弄清楚“并發(fā)”和“并行”兩個概念后,就會發(fā)現(xiàn)所謂“偽并發(fā)”是個多余、甚至會加重誤解的概念。并發(fā)說的是可以同時進行多個任務,但是它并不承諾這多個任務是“絕對的同時”開始,也不承諾多個任務是“絕對的同時”進行,而實現(xiàn)了后兩者的情況則被稱為“并行”。
即并發(fā)不一定并行,但是并行一定是并發(fā)。
在談論并發(fā)時所說的“同時”的“時”是個相對的、可變的“時間刻度”。兩件事是否算并發(fā),隨著這個“時間刻度”的變化也會發(fā)生變化。比如前文說很多人經常邊吃飯邊玩手機是并發(fā),較真的人可能就會不同意,覺得兩件事明明只能先后進行,原因就在于我和他在談論并發(fā)時的“時間刻度”沒統(tǒng)一。
假設某人吃飯大概10分鐘時間,于是將10分鐘視為一個不可分割的時間單位,如果在這個時間單位內還可以做其他事,就是實現(xiàn)了并發(fā)。但另一個人覺得并發(fā)的“時間刻度”最多為1秒,而1秒時間內顯然不能邊吃飯邊做其他事,于是他認為并發(fā)不成立。其實兩種說法都沒問題,只是并發(fā)的尺度不同。
并發(fā)是個應用場景遠大于并行,且在具體表現(xiàn)上可以非常靈活的執(zhí)行機制。比如計算機領域的單核處理器可以做多并發(fā),一個人做事也可以是多并發(fā),工廠里如同隊列執(zhí)行的單條流水線,其本質也是大并發(fā)。相比于并行,并發(fā)在理論上更先進,在實現(xiàn)上卻更簡單。
對并發(fā)的靈活應用,讓福特汽車在1913年就架設了自己的生產流水線,然后將汽車裝配速度一下子提高了8倍,創(chuàng)造了駭人的每10秒就有一臺T型車下線的記錄。
重新回到計算機技術上來,我們知道JavaScript是典型的單線程腳本語言,可是基于JavaScript的NodeJS的最大優(yōu)勢之一卻是“超強的高并發(fā)能力”。
也就是單線程不但可以實現(xiàn)并發(fā),在實際應用中還是被用來實現(xiàn)“高并發(fā)”的利器,因為它可以同時結合單線程對服務器資源的低要求和“異步”任務互不影響導致的事實上的“并發(fā)”這兩個優(yōu)勢。