【2020Python修煉記】python併發編程(六)補充—進程池和線程池

来源:https://www.cnblogs.com/bigorangecc/archive/2020/04/27/12790061.html
-Advertisement-
Play Games

1、進程池的作用 進程池來控制進程數目,比如httpd的進程模式,規定最小進程數和最大進程數 2、創建進程池的類Pool 如果指定numprocess為3,則進程池會從無到有創建三個進程,然後自始至終使用這三個進程去執行所有任務,不會開啟其他進程 Pool([numprocess [,initial ...


 

1、

 

2、 為啥要有 進程池和線程池

進程池來控制進程數目,比如httpd的進程模式,規定最小進程數和最大進程數

 

3、創建進程池的類Pool 

如果指定numprocess為3,則進程池會從無到有創建三個進程,然後自始至終使用這三個進程去執行所有任務,不會開啟其他進程

Pool([numprocess [,initializer [, initargs]]]):創建進程池 

  參數介紹:

numprocess:要創建的進程數,如果省略,將預設使用cpu_count()的值

initializer:是每個工作進程啟動時要執行的可調用對象,預設為None

initargs:是要傳給initializer的參數組

      方法介紹:

      主要方法:

p.apply(func [, args [, kwargs]])
在一個池工作進程中執行func(*args,**kwargs),然後返回結果。
需要強調的是:此操作並不會在所有池工作進程中並執行func函數。如果要通過不同參數併發地執行func函數,必須從不同線程調用p.apply()函數或者使用p.apply_async()


p.apply_async(func [, args [, kwargs]])
在一個池工作進程中執行func(*args,**kwargs),然後返回結果。此方法的結果是AsyncResult類的實例,callback是可調用對象,接收輸入參數。
當func的結果變為可用時,將理解傳遞給callback。callback禁止執行任何阻塞操作,否則將接收其他非同步操作中的結果。

p.close()

關閉進程池,防止進一步操作。如果所有操作持續掛起,它們將在工作進程終止前完成

p.jion()

等待所有工作進程退出。此方法只能在close()或 teminate()之後調用

 

4、進程池和線程池

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
import os


# pool = ThreadPoolExecutor(5)  # 池子裡面固定只有五個線程
# 括弧內可以傳數字 不傳的話預設會開設當前電腦cpu個數五倍的線程
pool = ProcessPoolExecutor(5)
# 括弧內可以傳數字 不傳的話預設會開設當前電腦cpu個數進程
"""
池子造出來之後 裡面會固定存在五個線程
這個五個線程不會出現重覆創建和銷毀的過程
池子造出來之後 裡面會固定的幾個進程
這個幾個進程不會出現重覆創建和銷毀的過程

池子的使用非常的簡單
你只需要將需要做的任務往池子中提交即可 自動會有人來服務你
"""


def task(n):
    print(n,os.getpid())
    time.sleep(2)
    return n**n

def call_back(n):
    print('call_back>>>:',n.result())
"""
任務的提交方式
    同步:提交任務之後原地等待任務的返回結果 期間不做任何事
    非同步:提交任務之後不等待任務的返回結果 執行繼續往下執行
        返回結果如何獲取???
        非同步提交任務的返回結果 應該通過回調機制來獲取
        回調機制
            就相當於給每個非同步任務綁定了一個定時炸彈
            一旦該任務有結果立刻觸發爆炸
"""
if __name__ == '__main__':
    # pool.submit(task, 1)  # 朝池子中提交任務  非同步提交
    # print('')
    t_list = []
    for i in range(20):  # 朝池子中提交20個任務
        # res = pool.submit(task, i)  # <Future at 0x100f97b38 state=running>
        res = pool.submit(task, i).add_done_callback(call_back)
        # print(res.result())  # result方法   同步提交
        # t_list.append(res)
    # 等待線程池中所有的任務執行完畢之後再繼續往下執行
    # pool.shutdown()  # 關閉線程池  等待線程池中所有的任務運行完畢
    # for t in t_list:
    #     print('>>>:',t.result())  # 肯定是有序的
"""
程式有併發變成了串列
任務的為什麼列印的是None
res.result() 拿到的就是非同步提交的任務的返回結果
"""
View Code

 

 

 

參考資料:

https://www.cnblogs.com/linhaifeng/articles/7428874.html#_label9

 


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

-Advertisement-
Play Games
更多相關文章
  • 減少 Python 中迴圈的使用 如何以及為什麼應該在 Python 中減少迴圈的使用? Python 提供給我們多種編碼方式。這裡還要註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流 ...
  • 今天出了一個重磅消息,個稅起徵點從3500上調到5000啦! 廣大IT農民工的生活壓力又減輕了一些,有沒有 晚上加一個雞腿,要不要~這裡還註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交 ...
  • 本篇文章給大家介紹一下PHP連接MySQL資料庫的三種方式(mysql、mysqli、pdo),結合實例形式分析了PHP基於mysql、mysqli、pdo三種方式連接MySQL資料庫的相關操作技巧與註意事項。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。 PHP與MySQL的連接 ...
  • 1. 什麼是介面測試?為什麼要做介面測試? 介面測試是測試系統組件間介面的一種測試。介面測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換,傳遞和控制管理過程,以及系統間的相互邏輯依賴關係等。 由於如今的系統複雜度不斷上升,傳統的測試方法成本急劇增加且測試 ...
  • 一、什麼是協程 引例: import time # 串列執行計算密集型的任務 1.2372429370880127 def func1(): for i in range(10000000): i + 1 def func2(): for i in range(10000000): i + 1 st ...
  • 一、Idea當中有兩種方法可以查看繼承關係 在Idea當中選中一個類,然後按Ctrl+H,可以快速查看當前所選類的繼承關係,如下圖: ​ 同樣選中一個類,按CTRL+ALT+U,即可生成當前類的繼承關係圖,如下圖: ​ 二、二者的區別 上述兩種方法都能幫我們快速查看類之間的層次關係。 ​ 第一種方法 ...
  • 前言 使用Python爬取任意網頁的資源文件,比如圖片、音頻、視頻;一般常用的做法就是把網頁的HTML請求下來通過XPath或者正則來獲取自己想要的資源,這裡我做了一個爬蟲工具軟體,可以一鍵爬取資源 媒體文件;但是需要說明的是,這裡爬取資源文件只針對HTML已有的文件,如果需要二次請求的是爬取不到的 ...
  • 前言 猶記得當初學習Python的時候,對於Python一切皆對象很是懵逼,因為Python是面向對象的動態型語言,而在函數及高階函數的應用中,如若對於一切皆對象不是有很透徹的瞭解,基礎不是那麼牢固的話,那麼對於今後的Python進階而言,就有點拖後腿了,鑒於有朋友跟我聯繫說,對於一切皆對象掌握的不 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...