1. 多進(jìn)程與多線程的區(qū)別
進(jìn)程與線程的區(qū)別在于二者的耗費(fèi)CPU與耗費(fèi)內(nèi)存的資源不同,對(duì)于耗費(fèi)CPU的比較多的操作使用多進(jìn)程編程.對(duì)于IO操作比較密集的情況要使用多線程編程.因?yàn)檫M(jìn)程切換的代價(jià)要高于線程.
*注意: 在windows中使用多進(jìn)程變編程的時(shí)候, 代碼一定要寫在if name=='main'中
2. 多進(jìn)程編程
(1) 進(jìn)程類: 進(jìn)程使用multiprocessing包中的Process,他的使用方法與Thread基本相同
(2)進(jìn)程池: 進(jìn)程池使用multiprocessing包中的Pool類, 它的第一個(gè)參數(shù)表示進(jìn)程池中的線程數(shù)量,如果不指定參數(shù)會(huì)默認(rèn)為CPU核數(shù)大小的進(jìn)程數(shù), 也可以通過multiprocessing.cpu_count()獲取CPU的核心數(shù)
代碼示例
import time
import multiprocessing
def test(seconds):
time.sleep(seconds)
print('sleep {} 秒'.format(seconds))
return seconds
if __name__ == '__main__':
pool = multiprocessing.Pool(multiprocessing.cpu_count())
# 使用apply_async方法往進(jìn)程池中添加進(jìn)程
result = pool.apply_async(func=test, args=(1,))
# 必須先將進(jìn)程池close掉才能join
pool.close()
# 等待進(jìn)程池中的進(jìn)程運(yùn)行完成
pool.join()
# 使用get方法獲取運(yùn)行結(jié)果
print(result.get())
# imap方法類似于map方法,會(huì)將列表中的每個(gè)元素作為函數(shù)的參數(shù)加入到池中運(yùn)行,并且返回結(jié)果順序與列表中元素順序相同
for res in pool.imap(test, [1, 3, 5]):
print(res)
# imap_unordered方法與imap方法基本相同,但返回結(jié)果的順序?yàn)橄葓?zhí)行完先返回
for res in pool.imap_unordered(test, [1, 3, 5]):
print(res)