python進程池Pool的apply與apply_async到底怎麼用?

2021-03-02 Python開發

作者丨魚香土豆絲
https://www.jianshu.com/p/b1934ff22b06

最近在解決問題的時候遇到了上下文衝突的問題,不得不用多進程來解決這個問題。

這個問題是StackOverflow沒有完整答案的問題,下一篇博客進行介紹。

多進程

python中使用multiprocessing模塊實現多進程。multiprocessing模塊提供了一個Process類來代表一個進程對象,這個模塊表示像線程一樣管理進程,是multiprocessing的核心,它與threading很相似,對多核CPU的利用率會比threading好的多。

Pool類

Pool類可以提供指定數量的進程供用戶調用,當有新的請求提交到Pool中時,如果池還沒有滿,就會創建一個新的進程來執行請求。如果池滿,請求就會告知先等待,直到池中有進程結束,才會創建新的進程來執行這些請求。

Signature: Pool(processes=None, initializer=None, initargs=(), maxtasksperchild=None)
Docstring: Returns a process pool object
File:      /usr/lib/python3.5/multiprocessing/context.py
Type:      method

Pool 中提供了如下幾個方法:

apply()
apply_async()
map()
map_async()
close()
terminal()
join()

這裡主要說一下apply和apply_async兩個,其他的內容可以進行百度搜索

apply

Signature: pool.apply(func, args=(), kwds={})
Docstring: Equivalent of `func(*args, **kwds)`.
File:      /usr/lib/python3.5/multiprocessing/pool.py
Type:      method

apply函數主要用於傳遞不定參數,主進程會被阻塞到函數執行結束。也就是說只有apply裡面的內容被執行完了,才會進行執行主函數的內容。

apply_async

Signature: pool.apply_async(func, args=(), kwds={}, callback=None, error_callback=None)
Docstring: Asynchronous version of `apply()` method.
File:      /usr/lib/python3.5/multiprocessing/pool.py
Type:      method

 推薦↓↓↓ 

涵蓋:程式設計師大咖、源碼共讀、程式設計師共讀、數據結構與算法、黑客技術和網絡安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、資料庫研發、幽默程式設計師等。

相關焦點

  • python並發函數apply_async踩坑記錄
    這個和Python的序列化庫(pickle)有關,當我們在進程之間傳遞變量或函數或某些自定義類型時,它們都需要能夠被pickle序列化,否則將導致進程之間無法傳遞這些信息。(這裡不深究為什麼pickle不支持序列化pool,重點先看看怎麼解決)問題暴露了,現在看看怎麼解決比較好。解決方案一:讓apply_async不調用成員函數。
  • Python | Python學習之多進程詳解
    進程詳解並行與並發怎麼理解?為了充分利用多核CPU資源,Python中大部分情況下都需要使用多進程。在python中我們如何創建多進程?進程和線程的區別我們經常迷惑於多進程和多線程,長的好像一樣,但是他們有本質上的區別,很多大佬也對進程和線程的概念做了很多通俗易懂的解釋,這裡我們引用阮一峰老師的博文,大家可以先去看看,理清楚線程和進程的區別。
  • 並發進行時--python編程必知必會(3)
    是進程池對象,multiprocessing.Pool()用來生成進程池,multiprocessing.cpu_count()獲取了CPU數量,於是,進程池pool裡面的進程數量和CPU核數相同#coding: utf-8import multiprocessingimport timedef do(a): time.sleep(0.01)
  • 快速掌握用python寫並行程序,乾貨滿滿
    這就要說下我前幾天做的一個作業了,當時我用python寫了個程序,結果運行了一天,這個速度可讓我愁了,我還怎麼優化,怎麼交作業啊。於是小子就去各大論壇尋丹問藥了,終於讓我發現可以用並行計算來最大化壓榨電腦的CPU,提升計算效率,而且python裡有multiprocessing這個庫可以提供並行計算接口,於是小子花1天時間改進程序,終於在規定時間內做出了自己滿意的結果,上交了作業。
  • Python數據分析—apply函數
    而這些操作都可以藉助python中的apply函數進行處理。今天介紹數據分析的第四課,教大家如何在python中用apply函數對數據框進行一些複雜一點的操作。date_frame['new_gender'] = date_frame.gender.apply(replace_gender_to_num)
  • Python 進程、線程和協程實戰指北
    線程池可以讓我們用固定數量的線程完成比線程數量多得多的任務。下面的代碼演示了使用 Python 的標準模塊創建線程池,計算多個數值的平方。當進程數量超過一定限度後,完成任務所需時間反而會延長。進程池提供了一個保持合理進程數量的方案,但合理進程數量需要根據硬體狀況及運行狀況來確定,通常設置為 CPU 的核數。multiprocessing.Pool(n) 可創建 n 個進程的進程池供用戶調用。如果進程池任務不滿,則新的進程請求會被立即執行;如果進程池任務已滿,則新的請求將等待至有可用進程時才被執行。向進程池提交任務有以下兩種方式。ap
  • Python入門系列(十二)——GUI+多進程
    但在某些特殊需求下還是需要我們去使用,所以python擁有多個第三方庫用以實現GUI,本章我們使用python基本模塊tkinter進行學習,因為需求並不大,所以不做太多拓展。繼續改寫上一章的IP查詢系統(= =,要玩爛了),首先略改下IpWhere.py以備調用~
  • 看幾段爬蟲代碼,詳解Python多線程、多進程、協程
    URL時必然會引起等待示例代碼就是典型的串行邏輯,parse_1將url和循環數傳遞給parse_2,parse_2請求並返回狀態碼後parse_1繼續迭代一次,重複之前步驟因為CPU在執行程序時每個時間刻度上只會存在一個線程,因此多線程實際上提高了進程的使用率從而提高了CPU的使用率實現多線程的庫有很多,這裡用concurrent.futures
  • 一文弄懂apply、map和applymap三種函數的區別
    CDA數據分析師 出品在日常處理數據的過程中,會經常遇到這樣的情況,對一個DataFrame進行逐行、逐列或者逐元素的操作,很多小夥伴也知道需要用到apply、map或者applymap,但是具體什麼情況下運用哪種方法或者說對這些方法了解不夠,用起來暈暈乎乎始終沒有很明白
  • Pandas高級應用(map()與apply()函數)
    一.map()函數import pandas as pdimport numpy as npimport osos.chdir(r'C:\Users\admin\Desktop')df1=pd.read_csv('0213.csv',engine='python
  • Pandas的map()、apply()、applymap()
    一般來說,其實用 apply() 就夠了,因為都支持了。但這裡還是簡單記錄下。Python 中的 Pandas 庫,map()、apply()、applymap() 的區別。 下面分別舉例說明。apply()apply() 的功能是將一個自定義函數作用於 DataFrame 對象的行或者列。並且,apply() 也可以作用於每一列元素。
  • Async Python 竟不比sync Python 快,怎麼回事?
    我盡力使它們貼近現實情況了,使用的架構是這個:我儘可能地模擬真實世界的部署:一個反向代理,python代碼(比如變量),後面再跟著一個資料庫。我還加入了一個外部資料庫連接池,因為我認為在Web應用程式實際部署中這種做法相當常見(至少對postgresql來說是這樣的)。
  • 「申請大學」,apply to 還是 apply for?
    什麼時候用 apply to?在表示「申請」時,常用到的是 apply for 這個組合。但「申請大學」,你看到的英文表達卻是 apply to universities。第一眼看到還以為是用錯了,但實際句型的確可以是:apply to somebody for something所以,下面這些搭配都沒有錯:1)You have to apply to the
  • Python數據分析中第二好用的函數 | apply
    為什麼說第二好用呢?做人嘛,最重要的就是謙虛,做函數也是一樣的,而apply就是這樣一個優雅而謙虛的函數。我們單獨用一篇來為apply樹碑立傳,原因有二,一是因為apply函數極其靈活高效,甚至是重新定義了pandas的靈活,一旦熟練運用,在數據清洗和分析界可謂是「屠龍在手,天下我有」;二是apply概念相對晦澀,需要結合具體案例去咀嚼和實踐。appl
  • Pandas三大利器-map、apply、applymap
    在這個時候,很容易想到的是 for循環。用 for循環是一種很簡單、直接的方式,但是運行效率很低。本文中介紹了 pandas中的三大利器: map、apply、applymap 來解決上述同樣的需求。—  03 —applyapply方法的作用原理和 map方法類似,區別在於 apply能夠傳入功能更為複雜的函數,可以說 apply
  • python爬蟲16 | 你,快去試試用多進程的方式重新去爬取豆瓣上的電影
    GIL 鎖會讓多線程顯得有點雞肋特別是在 CPU 密集型的代碼下多線程被 GIL 鎖搞得效率不高特別是對於多核的 CPU 來說如果想要充分利用 CPU 還是用多進程吧這樣我們就可以做到並行爬取提高了爬取的效率那麼,怎麼玩多進程呢恩接下來就是
  • apply家族
    apply()可以面向數據框、列表、向量等,同時任何函數都可以傳遞給apply()函數。作者:面面的徐爺 連結:https://www.jianshu.com/p/8e04245bfe6d一、apply() 家譜    apply家族為循環而生,又根據輸入、輸出的數據類型衍生8大派系,其中前三個最為人知:apply函數:處理矩陣的行或列lapply
  • pandas | 詳解DataFrame中的apply與applymap方法
    apply方法除了可以用在一整個DataFrame上之外,我們也可以讓它應用在某一行或者是某一列或者是某一個部分上也就是說apply的作用範圍是Series,雖然最終的效果是每一個元素都被改變了,但是apply的作用域並不是元素而是Series。我們通過apply操作行或者列,行和列將改變應用到每一個元素。
  • Pandas數據處理map, apply, applymap, Transform詳解
    Series.apply(func, convert_dtype=True, args=(), **kwd)[source]DataFrame.apply
  • call與apply方法的使用
    1)call([thisObj[,arg1[,arg2[,argN]]]]) :改變函數內部的this指向參數說明:thisObj:要指向的對象arg1,arg2,arg3…:參數列表,參數與參數之間通過逗號隔開2)apply