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)建
程序編寫完沒有運(yùn)行稱之為程序。正在運(yùn)行的代碼就是進(jìn)程。在Python3語言中,對(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ù)。語法格式如下:
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)庫。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é)果的元組拿出來分析,使用共享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,通過 1,通過率= 100.00%', 'Android', '7.1.2', 'samsung', '3.9.3.018'), ('2022-10-11 09:59:47', '共 1,通過 1,通過率= 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實(shí)現(xiàn)人臉識(shí)別(含源代碼)
Python可以從圖像或視頻中檢測(cè)和識(shí)別你的臉.人臉檢測(cè)與識(shí)別是計(jì)算機(jī)視覺領(lǐng)域的研究熱點(diǎn)之一.人臉識(shí)別的應(yīng)用包括人臉解鎖、安全防護(hù)等,醫(yī)生和醫(yī)務(wù)人員利用人臉識(shí)別來獲取病歷和病史,更好地診斷疾病,需要的朋友可以參考下2021-06-06Python實(shí)現(xiàn)在PyPI上發(fā)布自定義軟件包的方法詳解
在Python中我們經(jīng)常使用pip來安裝第三方Python軟件包,其實(shí)我們每個(gè)人都可以免費(fèi)地將自己寫的Python包發(fā)布到PyPI上。本文我們就將詳細(xì)介紹如何發(fā)布測(cè)試包,需要的可以參考一下2022-06-06tensorflow保持每次訓(xùn)練結(jié)果一致的簡(jiǎn)單實(shí)現(xiàn)
今天小編就為大家分享一篇tensorflow保持每次訓(xùn)練結(jié)果一致的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python中將正則過濾的內(nèi)容輸出寫入到文件中的實(shí)例
今天小編就為大家分享一篇python中將正則過濾的內(nèi)容輸出寫入到文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程
這篇文章主要介紹了用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程,包括單位格式轉(zhuǎn)換、分類匯總等基本操作,需要的朋友可以參考下2015-03-03Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳
這篇文章主要為大家詳細(xì)介紹了Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳的相關(guān)代碼,感興趣的小伙伴們可以參考一下2016-08-08Python使用matplotlib實(shí)現(xiàn)交換式圖形顯示功能示例
這篇文章主要介紹了Python使用matplotlib實(shí)現(xiàn)交換式圖形顯示功能,結(jié)合實(shí)例形式詳細(xì)分析了Python基于matplotlib模塊的數(shù)值運(yùn)算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2019-09-09