線程是操作系統(tǒng)分配CPU的基本單位,進(jìn)程是操作系統(tǒng)分配內(nèi)存的基本單位。
通常我們運(yùn)行的程序會(huì)包含一個(gè)或多個(gè)進(jìn)程,而每個(gè)進(jìn)程中又包含一個(gè)或多個(gè)線程。多線程的優(yōu)點(diǎn)在于多個(gè)線程可以共享進(jìn)程的內(nèi)存空間,所以進(jìn)程間的通信非常容易實(shí)現(xiàn);
但是如果使用官方的CPython解釋器,多線程受制于GIL(全局解釋器鎖),并不能利用CPU的多核特性,這是一個(gè)很大的問題。使用多進(jìn)程可以充分利用CPU的多核特性,但是進(jìn)程間通信相對(duì)比較麻煩,需要使用IPC機(jī)制(管道、套接字等)。
多線程適合那些會(huì)花費(fèi)大量時(shí)間在I/O操作上,但沒有太多并行計(jì)算需求且不需占用太多內(nèi)存的I/O密集型應(yīng)用。
多進(jìn)程適合執(zhí)行計(jì)算密集型任務(wù)(如:視頻編碼解碼、數(shù)據(jù)處理、科學(xué)計(jì)算等)、可以分解為多個(gè)并行子任務(wù)并能合并子任務(wù)執(zhí)行結(jié)果的任務(wù)以及在內(nèi)存使用方面沒有任何限制且不強(qiáng)依賴于I/O操作的任務(wù)。
擴(kuò)展:Python中實(shí)現(xiàn)并發(fā)編程通常有多線程、多進(jìn)程和異步編程三種選擇。
異步編程實(shí)現(xiàn)了協(xié)作式并發(fā),通過多個(gè)相互協(xié)作的子程序的用戶態(tài)切換,實(shí)現(xiàn)對(duì)CPU的高效利用,這種方式也是非常適合I/O密集型應(yīng)用的。