一:多進(jìn)程的優(yōu)點(diǎn)、應(yīng)用場(chǎng)景
耗CPU計(jì)算時(shí)多進(jìn)程速度大于多線程惠呼,可以最大化利用CPU計(jì)算导俘。多進(jìn)程有更強(qiáng)的容錯(cuò)性,一個(gè)進(jìn)程出錯(cuò)不會(huì)影響其他進(jìn)程剔蹋。通常不需要考慮鎖和同步資源的問(wèn)題旅薄。
二:進(jìn)程使用方法
- 實(shí)例化
multiprocessing.Process
,調(diào)用Threading的方法去進(jìn)行多線程編程 - 寫子類繼承
multiprocessing.Process
滩租,重寫相應(yīng)的方法
說(shuō)明:當(dāng)程序簡(jiǎn)單時(shí)可使用實(shí)例化方法赋秀,當(dāng)程序較復(fù)雜的時(shí)候利朵,實(shí)現(xiàn)邏輯較多,第二種方法猎莲。 - linux 中
os.fork()
拷貝父進(jìn)程全部數(shù)據(jù)資源绍弟,fork之后的代碼父子進(jìn)程都會(huì)繼續(xù)運(yùn)行。 -
concurrent.futures
下的ProcessPoolExecutor
就像上次的多線程那樣操作著洼,非常類似樟遣。
三: 進(jìn)程間通信
- 共享全局變量不適用多進(jìn)程,多線程可以用身笤。因?yàn)槎噙M(jìn)程的數(shù)據(jù)資源是隔離開(kāi)的豹悬,相互獨(dú)立無(wú)法共享變量。
- 需要明確的是多進(jìn)程間的通信和多線程不一樣液荸,不能用
queue.Queue
作為隊(duì)列要用multiprocessing.Queue
-
multiprocessing
的Queue
不能用于 Pool ( 進(jìn)程池)瞻佛,需要用multiprocessing
的Manager
的Queue
,需要實(shí)例化:queue = Manager().Queue()
-
multiprocessing
的Pipe
:用法recevid_pipe, send_pipe = Pipe()
只能適用于兩個(gè)指定的進(jìn)程娇钱。性能高于queue
四:進(jìn)程的實(shí)例代碼
#方法一:multiprocessing.Process
import multiprocessing
import requests
def download_html(i):
url = f'https://www.baidu.com/s?ie=UTF-8&wd={i}'
response = requests.get(url).text
print(response)
ids = list(range(100))
# 方法一
for i in range(5):
p = multiprocessing.Process(target=process, args=(i,))
p.start()
# 方法二
def multipro_main(ids ):
pool = multiprocessing.Pool(10)
pool.map(download_html, ids)
pool.close()
pool.join()
# 方法三
from multiprocessing.dummy import Pool as thpool
def thread_pool(ids ):
pool = thpool(10)
pool.map(download_html, ids)
pool.close()
pool.join()
# 方法四 (推薦伤柄,和多線程接口類似)
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(10) as executor:
executor.map(download_html, ids)
五:總結(jié)
concurrent.futures
是一個(gè)非常不錯(cuò)的庫(kù),多線程和多進(jìn)程無(wú)縫切換文搂,非常方便适刀。這個(gè)庫(kù)設(shè)計(jì)思路也很好,為后面的寫異步協(xié)程的代碼也打下基礎(chǔ)煤蹭。
代碼位置:github.com/rieuse/learnPython