1. Unix/Linux操作系統(tǒng)提供了一個fork()系統(tǒng)調(diào)用,它非常特殊。普通的函數(shù)調(diào)用,調(diào)用一次,返回一次,但是fork()調(diào)用一次,返回兩次,因為操作系統(tǒng)自動把當前進程(稱為父進程)復(fù)制了一份(稱為子進程),然后,分別在父進程和子進程內(nèi)返回。子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調(diào)用getppid()就可以拿到父進程的ID。
2. ?Python是跨平臺的,multiprocessing模塊就是跨平臺版本的多進程模塊。multiprocessing模塊提供了一個Process類來代表一個進程對象。
3.?如果要啟動大量的子進程,可以用進程池Pool的方式批量創(chuàng)建子進程?
4.?Process之間肯定是需要通信的,操作系統(tǒng)提供了很多機制來實現(xiàn)進程間的通信。Python的multiprocessing模塊包裝了底層的機制,提供了Queue、Pipes等多種方式來交換數(shù)據(jù)。
5.?在Thread和Process中,應(yīng)當優(yōu)選Process,因為Process更穩(wěn)定,而且,Process可以分布到多臺機器上,而Thread最多只能分布到同一臺機器的多個CPU上。Python的multiprocessing模塊不但支持多進程,其中managers子模塊還支持把多進程分布到多臺機器上。一個服務(wù)進程可以作為調(diào)度者,將任務(wù)分布到其他多個進程中,依靠網(wǎng)絡(luò)通信。
managers模塊封裝很好,不必了解網(wǎng)絡(luò)通信的細節(jié),就可以很容易地編寫分布式多進程程序。