簡(jiǎn)單談?wù)刾ython中的多進(jìn)程
進(jìn)程是由系統(tǒng)自己管理的。
1:最基本的寫法
from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': p = Pool(5) print(p.map(f, [1, 2, 3])) [1, 4, 9]
2、實(shí)際上是通過(guò)os.fork的方法產(chǎn)生進(jìn)程的
unix中,所有進(jìn)程都是通過(guò)fork的方法產(chǎn)生的。
multiprocessing Process os info(title): title , __name__ (os, ): , os.getppid() , os.getpid() f(name): info() , name __name__ == : info() p = Process(=f, =(,)) p.start() p.join()
3、線程共享內(nèi)存
threading run(info_list,n): info_list.append(n) info_list __name__ == : info=[] i (): p=threading.Thread(=run,=[info,i]) p.start() [0] [0, 1] [0, 1, 2] [0, 1, 2, 3] [0, 1, 2, 3, 4] [0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4, 5, 6] [0, 1, 2, 3, 4, 5, 6, 7] [0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
進(jìn)程不共享內(nèi)存:
multiprocessing Process run(info_list,n): info_list.append(n) info_list __name__ == : info=[] i (): p=Process(=run,=[info,i]) p.start() [1] [2] [3] [0] [4] [5] [6] [7] [8] [9]
若想共享內(nèi)存,需使用multiprocessing模塊中的Queue
multiprocessing Process, Queue f(q,n): q.put([n,]) __name__ == : q=Queue() i (): p=Process(=f,=(q,i)) p.start() : q.get()
4、鎖:僅是對(duì)于屏幕的共享,因?yàn)檫M(jìn)程是獨(dú)立的,所以對(duì)于多進(jìn)程沒有用
multiprocessing Process, Lock f(l, i): l.acquire() , i l.release() __name__ == : lock = Lock() num (): Process(=f, =(lock, num)).start() hello world 0 hello world 1 hello world 2 hello world 3 hello world 4 hello world 5 hello world 6 hello world 7 hello world 8 hello world 9
5、進(jìn)程間內(nèi)存共享:Value,Array
multiprocessing Process, Value, Array f(n, a): n.value = i ((a)): a[i] = -a[i] __name__ == : num = Value(, ) arr = Array(, ()) num.value arr[:] p = Process(=f, =(num, arr)) p.start() p.join() 0.0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3.1415927 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
#manager共享方法,但速度慢
multiprocessing Process, Manager f(d, l): d[] = d[] = d[] = l.reverse() __name__ == : manager = Manager() d = manager.dict() l = manager.list(()) p = Process(=f, =(d, l)) p.start() p.join() d l # print '-------------'這里只是另一種寫法 # print pool.map(f,range(10)) {0.25: None, 1: '1', '2': 2} [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
#異步:這種寫法用的不多
multiprocessing Pool time f(x): x*x time.sleep() x*x __name__ == : pool=Pool(=) res_list=[] i (): res=pool.apply_async(f,[i]) res_list.append(res) r res_list: r.get(timeout=10) #超時(shí)時(shí)間
同步的就是apply
相關(guān)文章
python中判斷數(shù)字是否為質(zhì)數(shù)的實(shí)例講解
在本篇文章里小編給大家分享了關(guān)于python中判斷數(shù)字是否為質(zhì)數(shù)的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12用pip給python安裝matplotlib庫(kù)的詳細(xì)教程
這篇文章主要介紹了用pip給python安裝matplotlib庫(kù)的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02win10系統(tǒng)下Anaconda3安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了win10系統(tǒng)下Anaconda3安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Python基于socket實(shí)現(xiàn)簡(jiǎn)單的即時(shí)通訊功能示例
這篇文章主要介紹了Python基于socket實(shí)現(xiàn)簡(jiǎn)單的即時(shí)通訊功能,涉及Python基于socket模塊實(shí)現(xiàn)tcp通信客戶端與服務(wù)器端相關(guān)操作技巧,需要的朋友可以參考下2018-01-01在Python中的Django框架中進(jìn)行字符串翻譯
這篇文章主要介紹了在Python中的Django框架中進(jìn)行字符串翻譯的一些初步方法,Django中還提供了待翻譯字符串檢測(cè)工具,需要的朋友可以參考下2015-07-07Python?中的反轉(zhuǎn)字符串reversed(),切片
這篇文章主要介紹了Python?中的反轉(zhuǎn)字符串reversed(),切片?,以相反的順序反轉(zhuǎn)和處理字符串可能是編程中的一項(xiàng)常見任務(wù)。Python?提供了一組工具和技術(shù),可以幫助我們快速有效地執(zhí)行字符串反轉(zhuǎn),下面來(lái)看看具體內(nèi)容吧2021-12-12Python實(shí)現(xiàn)異常值自動(dòng)檢測(cè)的案例分享
在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中,異常值的檢測(cè)是一個(gè)關(guān)鍵步驟,它有助于識(shí)別數(shù)據(jù)中的異常模式和離群點(diǎn),本文將介紹Python中異常值檢測(cè)的實(shí)戰(zhàn)案例,使用一些常見的技術(shù)和庫(kù),為大家提供全面的示例代碼和詳細(xì)解釋2024-01-01Django如何實(shí)現(xiàn)RBAC權(quán)限管理
這篇文章主要介紹了Django如何實(shí)現(xiàn)RBAC權(quán)限管理問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12python語(yǔ)音識(shí)別指南終極版(有這一篇足矣)
這篇文章主要介紹了python語(yǔ)音識(shí)別指南終極版的相關(guān)資料,包括語(yǔ)音識(shí)別的工作原理及使用代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09