python標準庫之MultiProcessing庫的研究 (1)

来源:http://www.cnblogs.com/zhiyong-ITNote/archive/2017/07/16/7191924.html
-Advertisement-
Play Games

MultiProcessing模塊是一個優秀的類似多線程MultiThreading模塊處理併發的包 之前接觸過一點這個庫,但是並沒有深入研究,這次閑著無聊就研究了一下,算是解惑吧。 ...


MultiProcessing模塊是一個優秀的類似多線程MultiThreading模塊處理併發的包
之前接觸過一點這個庫,但是並沒有深入研究,這次閑著無聊就研究了一下,算是解惑吧。
今天先研究下apply_async與map方法。傳聞就是這兩個方法分配進程池中的進程給相關函數,我想驗證下。
看下官網對這兩個的解釋:
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
A variant of the apply() method which returns a result object.

If callback is specified then it should be a callable which accepts a single argument. When the result becomes ready callback is applied to it, that is unless the call failed, in which case the error_callback is applied instead.

If error_callback is specified then it should be a callable which accepts a single argument. If the target function fails, then the error_callback is called with the exception instance.

Callbacks should complete immediately since otherwise the thread which handles the results will get blocked.


map(func, iterable[, chunksize])
A parallel equivalent of the map() built-in function (it supports only one iterable argument though). It blocks until the result is ready.

This method chops the iterable into a number of chunks which it submits to the process pool as separate tasks. The (approximate) size of these chunks can be specified by setting chunksize to a positive integer.

Pool可以提供指定數量的進程供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,才會創建新的進程來運行它

下麵看下程式吧:

from multiprocessing import Pool
import time
import os


def func(msg):
    print('msg: %s %s' % (msg, os.getpid()))
    time.sleep(3)
    print("end")


if __name__ == '__main__':
    pool = Pool(4)
    for i in range(4):
        msg = 'hello %d' % (i)
        pool.apply_async(func, (msg, ))
    # pool.map(func, range(4))
    print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()   # 調用join之前,先調用close函數,否則會出錯。執行完close後不會有新的進程加入到pool,join函數等待所有子進程結束
    print("Sub-process(es) done.")

運行結果:

去掉map註釋,在apply_async函數處加上註釋

看下進程池進程不夠的情況下的程式及運行結果:

from multiprocessing import Pool
import time
import os


def func(msg):
    print('msg: %s %s' % (msg, os.getpid()))
    time.sleep(3)
    print("end")


if __name__ == '__main__':
    pool = Pool(3)
    '''for i in range(4):
        msg = 'hello %d' % (i)
        pool.apply_async(func, (msg, ))'''
    pool.map(func, range(4))
    print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()   # 調用join之前,先調用close函數,否則會出錯。執行完close後不會有新的進程加入到pool,join函數等待所有子進程結束
    print("Sub-process(es) done.")

程式結果:

可以看到,如果進程池的進程數量大於等於所要運行的函數的次數,那就可以很順利,而且看著結果也很理所當然;但是如果進程池的進程的數量小於所要運行的函數的次數,那麼就會有一個進程發生阻塞,即兩個或多個函數共用一個進程.
而且,apply_async函數的第二個參數傳入的是一個參數值,一旦運行這個函數,就會分配一個進程給函數,註意是非同步的哦,因此如果需要分配多個進程就需要有一個for迴圈或是while迴圈;對於map函數,其第二個參數值接收的是一個迭代器,因此就不用在用for迴圈了。要記住,這兩個函數所實現的就是依次將進程池裡的進程分配給函數。

順便吐槽下,全英文的 MultiProcessing官網 看的很懵逼痛苦,又很有意思,不得不說,對英語還是很有幫助的.....


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 該項目主要將每個服務都配置一個消息隊列,服務間通過消息進行傳遞,同時提供了控制台指令,進行服務的管理,實現一些後臺的工作 git地址:https://coding.net/u/mich/p/MiniServer/git ...
  • Eclipse快捷鍵Ctrl+1 快速修複Ctrl+D: 刪除當前行 Ctrl+Alt+↓ 複製當前行到下一行(複製增加)Ctrl+Alt+↑ 複製當前行到上一行(複製增加)Alt+↓ 當前行和下麵一行交互位置Alt+↑ 當前行和上面一行交互位置Alt+← 前一個編輯的頁面Alt+→ 下一個編輯的頁 ...
  • 前言 Java的基類Object提供了一些方法,其中equals()方法用於判斷兩個對象是否相等,hashCode()方法用於計算對象的哈希碼。equals()和hashCode()都不是final方法,都可以被重寫(overwrite)。 本文介紹了2種方法在使用和重寫時,一些需要註意的問題。 一 ...
  • 引言 如果說JdbcTemplate類是Spring Jdbc的核心類,那麼execute方法算得上Spring Jdbc的核心方法了,畢竟JdbcTemplate的很多public方法內部實際上是調用execute方法實現的。 public T execute(ConnectionCallback ...
  • 第一個註意點:選擇器的使用(標簽、class、id) 三種選擇器中id(#)的優先順序最高,根據id名篩選出唯一元素; 如下輸入:#menu{ width:1200px; height:45px; background:#90F} <div id="menu"></div> 其次是class(.)的優 ...
  • 10年的技術開發團隊,提供網站建設,APP開發,網站推廣等服務,專業微信小程式定製開發,需要這方面的朋友,可以咨詢一下。 案例演示: 成功案例: 聯繫方式:8582-36016 ,微信號:luenmicro ,電話:131-1221-5717 ...
  • 註意 if(i%prime[j]==0) 不要寫成if(!i%prime[j]) ...
  • 三木運算,三元運算 name = 值1 if 條件 else 值2 深拷貝淺拷貝 str創建一個值不能修改,如果修改在,創建一個 對於int和str 賦值,深拷貝,淺拷貝地址是不變的 對於dict,list,tup 淺拷貝僅拷貝最外層 深拷貝是除了最內層都拷貝 函數 動態參數 萬能參數 *arges ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...