Python實(shí)現(xiàn)多進(jìn)程之間共享變量
Python多進(jìn)程之間共享變量
Python 多線程之間共享變量很簡(jiǎn)單,直接定義全局 global 變量即可。而多進(jìn)程之間是相互獨(dú)立的執(zhí)行單元,這種方法就不可行了。
不過(guò) Python 標(biāo)準(zhǔn)庫(kù)已經(jīng)給我們提供了這樣的能力,使用起來(lái)也很簡(jiǎn)單。
但要分兩種情況來(lái)看,一種是 Process 多進(jìn)程,一種是 Pool 進(jìn)程池的方式。
Process 多進(jìn)程
使用 Process 定義的多進(jìn)程之間共享變量可以直接使用 multiprocessing 下的 Value,Array,Queue 等,如果要共享 list,dict,可以使用強(qiáng)大的 Manager 模塊。
import multiprocessing def func(num): # 共享數(shù)值型變量 # num.value = 2 # 共享數(shù)組型變量 num[2] = 9999 if __name__ == '__main__': # 共享數(shù)值型變量 # num = multiprocessing.Value('d', 1) # print(num.value) # 共享數(shù)組型變量 num = multiprocessing.Array('i', [1, 2, 3, 4, 5]) print(num[:]) p = multiprocessing.Process(target=func, args=(num,)) p.start() p.join() # 共享數(shù)值型變量 # print(num.value) # 共享數(shù)組型變量 print(num[:])
Pool 進(jìn)程池
進(jìn)程池之間共享變量是不能使用上文方式的,因?yàn)檫M(jìn)程池內(nèi)進(jìn)程關(guān)系并非父子進(jìn)程,想要共享,必須使用 Manager 模塊來(lái)定義。
from multiprocessing import Pool, Manager def func(my_list, my_dict): my_list.append(10) my_list.append(11) my_dict['a'] = 1 my_dict['b'] = 2 if __name__ == '__main__': manager = Manager() my_list = manager.list() my_dict = manager.dict() pool = Pool(processes=2) for i in range(0, 2): pool.apply_async(func, (my_list, my_dict)) pool.close() pool.join() print(my_list) print(my_dict)
還有一點(diǎn)需要注意,在共享 list 時(shí),像下面這樣寫 func 是不起作用的。
def func(my_list, my_dict): my_list = [10, 11] my_dict['a'] = 1 my_dict['b'] = 2
這樣寫相當(dāng)于重新定義了一個(gè)局部變量,并沒有作用到原來(lái)的 list 上,必須使用 append,extend 等方法。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中精確的浮點(diǎn)數(shù)運(yùn)算示例
這篇文章主要為大家介紹了python中精確的浮點(diǎn)數(shù)運(yùn)算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07python對(duì)二維數(shù)組賦值問(wèn)題
這篇文章主要介紹了python對(duì)二維數(shù)組賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08基于python requests selenium爬取excel vba過(guò)程解析
這篇文章主要介紹了基于python requests selenium爬取excel vba過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08如何使用OpenCV實(shí)現(xiàn)手勢(shì)音量控制
今天來(lái)學(xué)習(xí)一下如何使用OpenCV實(shí)現(xiàn)手勢(shì)音量控制,本次實(shí)驗(yàn)需要使用OpenCV和mediapipe庫(kù)進(jìn)行手勢(shì)識(shí)別,并利用手勢(shì)距離控制電腦音量,感興趣的朋友跟隨小編一起看看吧2023-11-11python 如何使用find和find_all爬蟲、找文本的實(shí)現(xiàn)
這篇文章主要介紹了python 如何使用find和find_all,爬蟲、找文本,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python實(shí)現(xiàn)單項(xiàng)鏈表的最全教程
單向鏈表也叫單鏈表,是鏈表中最簡(jiǎn)單的一種形式,它的每個(gè)節(jié)點(diǎn)包含兩個(gè)域,一個(gè)信息域(元素域)和一個(gè)鏈接域,這個(gè)鏈接指向鏈表中的下一個(gè)節(jié)點(diǎn),而最后一個(gè)節(jié)點(diǎn)的鏈接域則指向一個(gè)空值,這篇文章主要介紹了Python實(shí)現(xiàn)單項(xiàng)鏈表,需要的朋友可以參考下2023-01-01