Python實現(xiàn)多進程之間共享變量
Python多進程之間共享變量
Python 多線程之間共享變量很簡單,直接定義全局 global 變量即可。而多進程之間是相互獨立的執(zhí)行單元,這種方法就不可行了。
不過 Python 標(biāo)準(zhǔn)庫已經(jīng)給我們提供了這樣的能力,使用起來也很簡單。
但要分兩種情況來看,一種是 Process 多進程,一種是 Pool 進程池的方式。
Process 多進程
使用 Process 定義的多進程之間共享變量可以直接使用 multiprocessing 下的 Value,Array,Queue 等,如果要共享 list,dict,可以使用強大的 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 進程池
進程池之間共享變量是不能使用上文方式的,因為進程池內(nèi)進程關(guān)系并非父子進程,想要共享,必須使用 Manager 模塊來定義。
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)
還有一點需要注意,在共享 list 時,像下面這樣寫 func 是不起作用的。
def func(my_list, my_dict): my_list = [10, 11] my_dict['a'] = 1 my_dict['b'] = 2
這樣寫相當(dāng)于重新定義了一個局部變量,并沒有作用到原來的 list 上,必須使用 append,extend 等方法。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于python requests selenium爬取excel vba過程解析
這篇文章主要介紹了基于python requests selenium爬取excel vba過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08python 如何使用find和find_all爬蟲、找文本的實現(xiàn)
這篇文章主要介紹了python 如何使用find和find_all,爬蟲、找文本,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10