Python獲取多進(jìn)程執(zhí)行的返回值實(shí)現(xiàn)
眾所周知,因?yàn)镚IL的原因,Python至今不支持真正的多線程。為了達(dá)到并行運(yùn)行的目的,我們往往就需要運(yùn)行多進(jìn)程了。
一個(gè)任務(wù)由一個(gè)進(jìn)程來運(yùn)行,可是它的結(jié)果怎么來獲取呢?
方法-1.
第一種方法是記錄在全局變量中。當(dāng)然這時(shí)候要注意可能會(huì)需要用到Lock. 下面是一個(gè)例子。
Program-1
import multiprocessing from multiprocessing import Pool info_manager = multiprocessing.Manager() info_lock = info_manager.Lock() info_dict = info_manager.dict() def add(n): ? ? global info_dict, info_lock? ? ?? ? ? s = 0 ? ? for i in range(n+1): ? ? ? ? s += i ? ?? ? ? info_lock.acquire() ? ? info_dict[n] = s ? ? info_lock.release() ? ?? ? ? print("In task %d: %d -> %d" % (n, n, s)) def calculate(): ? ? pool = Pool(processes=4)? ? ? tasks = range(10) ? ? for n in tasks: ? ? ? ? pool.apply_async(add, (n,)) ? ? ? ?? ? ? pool.close() ? ? pool.join() ? ?? ? ?? def print_result(): ? ? global info_dict ? ?? ? ? key_list = sorted(info_dict.keys()) ? ?? ? ? for key in key_list: ? ? ? ? print("%s: %s" % (key, info_dict[key]))? ? ?? ? ?? if __name__ == '__main__': ? ? calculate() ? ? print_result()
除了使用全局變量,還有沒有其他的方法呢?畢竟全局變量似乎看起來有點(diǎn)危險(xiǎn),不小心就會(huì)被弄壞。
方法-2.
第二種方法,就是記錄下multiprocessing.Pool.apply_async的返回值(假設(shè)稱之為result),然后在Pool被join之后,利用result.get()方法來得到原任務(wù)函數(shù)的返回值。在這里,multiprocessing.Pool.apply_async的返回值的類型是multiprocessing.pool.ApplyResult,其get()方法會(huì)返回原任務(wù)函數(shù)的返回值。
下面是把上面的那個(gè)例子重新寫一遍。
Program-2
import multiprocessing from multiprocessing import Pool def add(n): ? ? s = 0 ? ? for i in range(n+1): ? ? ? ? s += i ? ? return (n, s) def calculate(): ? ? pool = Pool(processes=4) ? ? tasks = range(10) ? ? result_list = list() ? ? info_dict = dict() ? ?? ? ? for n in tasks: ? ? ? ? result_list.append(pool.apply_async(add, (n,))) ? ? ? ?? ? ? pool.close() ? ? pool.join() ? ?? ? ? for result in result_list: ? ? ? ? k, v = result.get() ? ? ? ? info_dict[k] = v ? ? ? ?? ? ? return info_dict ? ?? ? ?? def print_result(): ? ? info_dict = calculate() ? ?? ? ? key_list = sorted(info_dict.keys()) ? ?? ? ? for key in key_list: ? ? ? ? print("%s: %s" % (key, info_dict[key]))? ? ?? ? ?? if __name__ == '__main__': ? ? calculate() ? ? print_result()
另外,其實(shí)也可以不用等到 Pool join 之后才能調(diào)get(). 可以立刻調(diào)用get(), 但這可能會(huì)造成阻塞。
而get()函數(shù)其實(shí)有一個(gè)參數(shù),可以指定超時(shí)時(shí)間以免無限等下去,如,result.get(timeout=2), 就是設(shè)置超時(shí)為2秒。
其定義在Python3中如下:
get([timeout]) Return the result when it arrives. If timeout is not None and the result does not arrive within timeout seconds then multiprocessing.TimeoutError is raised. If the remote call raised an exception then that exception will be reraised by get().
也就是說,如果超時(shí)了,就會(huì)拋出一個(gè)multiprocessing.TimeoutError異常;
而如果該任務(wù)進(jìn)程內(nèi)拋了異常,也會(huì)被get()重新拋出來。
本文程序通過Python2和Python3的測(cè)試。
到此這篇關(guān)于Python獲取多進(jìn)程執(zhí)行的返回值實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python獲取多進(jìn)程執(zhí)行的返回值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python配置pip國(guó)內(nèi)鏡像源的實(shí)現(xiàn)
這篇文章主要介紹了Python配置pip國(guó)內(nèi)鏡像源的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08pandas 如何保存數(shù)據(jù)到excel,csv
這篇文章主要介紹了pandas 如何保存數(shù)據(jù)到excel,csv的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python3 全自動(dòng)更新已安裝的模塊實(shí)現(xiàn)
這篇文章主要介紹了Python3 全自動(dòng)更新已安裝的模塊實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Python softmax實(shí)現(xiàn)及數(shù)值穩(wěn)定性詳解
這篇文章主要為大家介紹了Python softmax實(shí)現(xiàn)及數(shù)值穩(wěn)定性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07python模擬實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python模擬實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03使用python實(shí)現(xiàn)將視頻中的音頻分離出來
這篇文章主要介紹了使用python實(shí)現(xiàn)將視頻中的音頻分離出來,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11python 對(duì)象真假值的實(shí)例(哪些視為False)
這篇文章主要介紹了python 對(duì)象真假值的實(shí)例(哪些視為False),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12跟老齊學(xué)Python之用while來循環(huán)
while,翻譯成中文是“當(dāng)...的時(shí)候”,這個(gè)單詞在英語中,常常用來做為時(shí)間狀語,while ... someone do somthing,這種類型的說法是有的。2014-10-10