python多進(jìn)程實(shí)現(xiàn)數(shù)據(jù)共享的示例代碼
背景
安卓ui自動(dòng)化框架,使用的是多進(jìn)程實(shí)現(xiàn)的多設(shè)備并行。而在撈取數(shù)據(jù)做數(shù)據(jù)匯總時(shí),需要多進(jìn)程可以數(shù)據(jù)共享。
進(jìn)程、進(jìn)程創(chuàng)建
程序編寫完沒(méi)有運(yùn)行稱之為程序。正在運(yùn)行的代碼就是進(jìn)程。在Python3語(yǔ)言中,對(duì)多進(jìn)程支持的是multiprocessing模塊和subprocess模塊。multiprocessing模塊為在子進(jìn)程中運(yùn)行任務(wù)、通訊和共享數(shù)據(jù),以及執(zhí)行各種形式的同步提供支持。
Python提供了非常好用的多進(jìn)程包multiprocessing,只需要定義一個(gè)函數(shù),Python會(huì)完成其他所有事情。借助這個(gè)包,可以輕松完成從單進(jìn)程到并發(fā)執(zhí)行的轉(zhuǎn)換。multiprocessing支持子進(jìn)程、通信和共享數(shù)據(jù)。語(yǔ)法格式如下:
Process([group [, target [, name [, args [, kwargs]]]]])
進(jìn)程間通信
多線程:共享變量很簡(jiǎn)單,直接定義全局 global 變量即可
多進(jìn)程:全局變量在多個(gè)進(jìn)程中不共享,進(jìn)程之間的數(shù)據(jù)是獨(dú)立的,默認(rèn)情況下互不影響。
from multiprocessing import Process
num=1
def work1():
global num
num+=5
print('子進(jìn)程1運(yùn)行,num:',num)
def work2():
global num
num += 10
print('子進(jìn)程2運(yùn)行,num:',num)
if __name__=='__main__':
print('父進(jìn)程開始運(yùn)行')
p1=Process(target=work1)
p2=Process(target=work2)
p1.start()
p2.start()
p1.join()
p2.join()
執(zhí)行結(jié)果
父進(jìn)程開始運(yùn)行
子進(jìn)程1運(yùn)行,num:6
子進(jìn)程2運(yùn)行,num:11
- 但是python也提供了這樣的標(biāo)準(zhǔn)庫(kù)。process進(jìn)程的manager模塊和pool進(jìn)程的manager模塊。
進(jìn)程間共享數(shù)據(jù)
- 共享數(shù)值型數(shù)據(jù)
主進(jìn)程與子進(jìn)程共用一個(gè)value
import multiprocessing
def func(num):
num.value = 2
if __name__ == "__main__":
num = multiprocessing.Value("d", 1)
p = multiprocessing.Process(target=func, args=(num,))
p.start()
p.join()- 共享數(shù)組型數(shù)據(jù)
子進(jìn)程改變dict,list,主進(jìn)程dict,list跟著改變
共享list實(shí)踐
現(xiàn)在想把每個(gè)手機(jī)的自動(dòng)化運(yùn)行結(jié)果的元組拿出來(lái)分析,使用共享list的方式
# 多進(jìn)程中,同一個(gè)變量,各自有一份拷貝存在于每個(gè)進(jìn)程中, 互不影響;
# 多線程中,所有變量都由所有線程共享,任何一個(gè)變量都可以被任何一個(gè)線程修改.
# multiprocessing.Manager()實(shí)現(xiàn)多進(jìn)程中的數(shù)據(jù)共享
RESULT_TIMEPARAM = multiprocessing.Manager().list()
RESULT_REPORT_NAME_LIST = multiprocessing.Manager().list()
RESULT_TUPLE_LIST = multiprocessing.Manager().list()
devices_pool = []
for tmp_udid in ConfigData().mobile_data().keys():
devices_pool.append(multiprocessing.Process(target=run_testcase, args=(tmp_udid,RESULT_TIMEPARAM,RESULT_REPORT_NAME_LIST,
RESULT_TUPLE_LIST )))
for devices_udid in devices_pool:
devices_udid.start()
for devices_udid in devices_pool:
devices_udid.join()得到的RESULT_TUPLE_LIST:
[('2022-10-11 09:59:46', '共 1,通過(guò) 1,通過(guò)率= 100.00%', 'Android', '7.1.2', 'samsung', '3.9.3.018'), ('2022-10-11 09:59:47', '共 1,通過(guò) 1,通過(guò)率= 100.00%', 'Android', '10', 'OPPO', '3.9.3.018')]
到此這篇關(guān)于python多進(jìn)程實(shí)現(xiàn)數(shù)據(jù)共享的示例代碼的文章就介紹到這了,更多相關(guān)python多進(jìn)程數(shù)據(jù)共享內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python開發(fā)教程之os.path的常用操作總結(jié)
這篇文章主要介紹了Python開發(fā)教程之os.path的常用操作,os模塊最常用的功能之一就是文件和目錄操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
Python實(shí)現(xiàn)冒泡排序算法的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)冒泡排序算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
python使用Random隨機(jī)生成列表的方法實(shí)例
在日常的生活工作和系統(tǒng)游戲等設(shè)計(jì)和制作時(shí),經(jīng)常會(huì)碰到產(chǎn)生隨機(jī)數(shù),用來(lái)解決問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于python使用Random隨機(jī)生成列表的相關(guān)資料,需要的朋友可以參考下2022-04-04
Python的SimpleHTTPServer模塊用處及使用方法簡(jiǎn)介
這篇文章主要介紹了Python的SimpleHTTPServer模塊用處及使用方法簡(jiǎn)介,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
python內(nèi)置模塊pathlib.Path類操作目錄和文件的使用
本文主要介紹了python內(nèi)置模塊pathlib.Path類操作目錄和文件的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
Python3實(shí)現(xiàn)配置文件差異對(duì)比腳本
這篇文章主要介紹了Python3實(shí)現(xiàn)配置文件差異對(duì)比腳本,本文通過(guò)案例場(chǎng)景分析給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11

