python 多進程

来源:https://www.cnblogs.com/Hybb/archive/2019/09/13/11517852.html
-Advertisement-
Play Games

多進程 python中創建進程模塊為: 進程之間數據不是共用的 註意:windowns下進程運行會報錯,linux mac 不會出現此問題。解決方法: 將進程啟動代碼放到main里即可執行,示例代碼: 進程常用方法: :和線程一樣,預設會等子進程執行完畢後,代碼才會繼續往下執行 : True 為 主 ...


多進程

python中創建進程模塊為:multiprocessing

進程之間數據不是共用的

註意:windowns下進程運行會報錯,linux mac 不會出現此問題。解決方法:

將進程啟動代碼放到main里即可執行,示例代碼:

import multiprocessing

def task(arg):
    print(arg)

def run():
    for i in range(10):
        # 實例化一個進程
        process = multiprocessing.Process(target=task,args=(i,)) 
        # 進程啟動
        process.start()

if __name__ == '__main__':
    run()  # main下才能正確執行,不然會報錯

進程常用方法:

  • join():和線程一樣,預設會等子進程執行完畢後,代碼才會繼續往下執行
  • daemon:
    • True 為 主進程執行完代碼,程式會直接結束,不會等待子進程執行完畢
    • False為:主進程執行完畢後,會等待子進程執行完畢
  • name:為進程起一個名稱
  • multiprocessing.current_process() :獲取當前進程
  • ident/pid:獲取當前進程的ID號

示例代碼:

import time
import multiprocessing

def task(arg):
    p = multiprocessing.current_process() # 獲取當前進程
    print(p.name) # 列印當前進程名稱
    print(p.ident) # 獲取當前進程的ID號
    print(p.pid) # 獲取當前進程的ID號
    time.sleep(2)
    print(arg)

def run():
    print('11111111')
    #### 進程一
    process1 = multiprocessing.Process(target=task,args=(1,))
    # False 主進程執行完畢後,會等待子進程執行完畢
    # True 為不等待子進程執行完畢,主進程執行完畢後,程式就會結束
    process1.daemon = False
    # 為當前進程起一個名稱
    process1.name = 'proc1'
    process1.start()
    # 預設會等進程執行完畢後,代碼才會繼續往下執行
    process1.join()
    
    print('22222222')
    
    #### 進程二
    process2 = multiprocessing.Process(target=task, args=(2,))
    process2.daemon = False
    process2.name = 'proc2'
    process2.start()
    process2.join()
    
    print('33333333')

if __name__ == '__main__':
    run()

類繼承方式創建進程(示例代碼如下:)

##################### 類繼承方式創建進程  #####################
import multiprocessing

class MyProcess(multiprocessing.Process):
    def run(self):
        print('當前進程', multiprocessing.current_process())

def run():
    t1 = MyProcess()
    t1.start()

    t2 = MyProcess()
    t2.start()

if __name__ == '__main__':
    run()

進程之間的數據共用

multiprocessing.Queue(列表數據共用)

windows下執行數據共用有點問題,所以使用下麵方法可以解決

  • 示例代碼:
##################### 進程之間的數據共用 multiprocessing.Queue #####################
import multiprocessing

q = multiprocessing.Queue() # 數據共用可以使用的隊列

def task(arg,q):
    q.put(arg)

def run():
    for num in range(10):
        proc = multiprocessing.Process(target=task,args=(num,q))
        proc.start()
    while True:
        v = q.get()
        print(v)

if __name__ == '__main__':
    run()

multiprocessing.Manger(字典數據共用)

linux mac下可以正常執行

示例代碼:

import multiprocessing

m = multiprocessing.Manager()
dic = m.dict()

def task(arg):
    dic[arg] = 100

def run():
    for num in range(10):
        proc = multiprocessing.Process(target=task,args=(num,))
        proc.start()

    input('>>>')
    print(dic.values())

if __name__ == '__main__':
    run()

windowns:

  • 第一種方法
import multiprocessing

def task(arg,dic):
    dic[arg] = 100

if __name__ == '__main__':
    m = multiprocessing.Manager()
    dic = m.dict()

    for num in range(10):
        proc = multiprocessing.Process(target=task,args=(num,dic))
        proc.start()
        proc.join()  # 一個一個進程等待,執行完了,再執行下一個

    print(dic)
  • 第二種方法(linux也適用)
import time
import multiprocessing

def task(arg,dic):
    time.sleep(2)
    dic[arg] = 100

if __name__ == '__main__':
    m = multiprocessing.Manager()
    dic = m.dict()

    process_list = []
    for num in range(10):
        proc = multiprocessing.Process(target=task,args=(num,dic))
        proc.start()

        process_list.append(proc)

    while True:
        count = 0
        for p in process_list:
            if not p.is_alive():
                count += 1
        if count == len(process_list):
            break

    print(dic)

進程鎖

概念:不管線程還是進程,鎖都是一樣的

什麼時候用鎖: 只有進程或線程操作同一個數據的時候才會進行加鎖,如果各自做各自的是不需要加鎖的

具體意義看多線程里的鎖機制,和進程一樣

多線程鎖:https://www.cnblogs.com/Hybb/p/11512011.html

鎖的方法

  • Lock(一次放行一個)
  • RLock 遞歸鎖(一次放行多個)
  • BoundedSemaphore (一次放N個) 信號量
  • Condition (1次放x個數)動態輸入
  • Event (事件)1次放所有

示例代碼

import time
import multiprocessing

lock = multiprocessing.Lock()
lock = multiprocessing.RLock()
lock = multiprocessing.BoundedSemaphore()
lock = multiprocessing.Condition()
lock = multiprocessing.Event()

def task(arg):
    print('開始了')
    lock.acquire()
    time.sleep(2)
    print(arg)
    lock.release()

def run():
    for num in range(1,3):
        proc = multiprocessing.Process(target=task,args=(num,))
        proc.start()

if __name__ == '__main__':
    run()

進程池

使用的模塊 concurrent.futures

和線程池是一樣的

示例代碼:

import time
# 導入進程池模塊
from concurrent.futures import ProcessPoolExecutor

def task(arg):
    time.sleep(2)
    print(arg)

if __name__ == '__main__':
    # 創建一個進程池
    pool = ProcessPoolExecutor(5)
    for num in range(10):
        pool.submit(task,num)

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

-Advertisement-
Play Games
更多相關文章
  • 如果您的瀏覽器支持 XSLT,那麼在瀏覽器中它可被用來將文檔轉換為 XHTML。 如果您的瀏覽器支持 XSLT,那麼在瀏覽器中它可被用來將文檔轉換為 XHTML。 JavaScript 解決方案 在前面的章節,我們已向您講解如何使用 XSLT 將某個 XML 文檔轉換為 XHTML。我們是通過以下途 ...
  • 一、html語言概述 超文本標記語言(英語:HyperText Markup Language,簡稱:HTML)是一種用於創建網頁的標準標記語言。 您可以使用 HTML 來建立自己的 WEB 站點,HTML 運行在瀏覽器上,由瀏覽器來解析。 二、目前瀏覽器內核(瞭解): 三、HTML 初體驗 上述實 ...
  • ​ 路由獨立守衛,顧名思義就是這個路由自己的守衛任務,就如同咱們LOL,我們守衛的就是獨立一條路,保證我們這條路不要被敵人攻剋(當然我們也得打團配合) 在官方定義是這樣說的:你可以在路由配置上直接定義 beforeEnter 守衛,這些守衛與全局前置守衛的方法參數是一樣的。 參數如下: 我們在這裡使 ...
  • 前言: 對於大多數前端同學來說閉包一直是個很讓人困惑的問題,我自己之前雖說在項目中有意無意的用到但是都沒有刻意的去深入研究它,大部分時間是為了應付面試。後來某一天我突然意識到自己要去認真研究下它,因為知其然而不知其所以然並不應該是學習一種語言的態度,所以我打算寫篇文章嘗試著用我自己的理解去解釋下閉包 ...
  • 工廠設計模式: 顧名思義,該模式是用來生產對象的。在面向對象的設計模式中,萬物皆對象,若使用new來創建對象,就會對該對象產生強耦合,加入我們需要更換該對象,那麼使用該對象的對象都需要進行修改,這顯然違背了開閉原則(OCP)。如果我們使用工廠來產生對象,我們只需要與這個工廠打交道就可以了,無需關心具 ...
  • 早期的電腦通信需要有一個中間件,A要給B傳東西,A必須要把信息傳給中間件,B再把從中間件中拿到信息 由於不同機器之間需要通信就產生了網路 軟體開發的架構 1.C/S架構 伺服器-客戶機,即Client-Server架構,C/S架構通常採取兩層結構.Sever負責數據的管理,Client負責完成與用 ...
  • PHP+Nginx環境搭建 作者:王宇陽( Mirror )^_^ 參考文章: ​ "Nginx+PHP+MySQL安裝參考" ​ "PHP源碼安裝經驗" ​ "PHP源碼環境搭建過程中常見問題" CentOS環境 配置CentOS 7網路: CentOS(最小安裝)預設是不打開網路的 啟動網路 v ...
  • 1、在GitHub上建一個新倉庫 ​ 2、配置Git的SSH KEY 生成SSH添加到GitHub 回到你的git bash中, git config global user.name "yourname" git config global user.email "youremail" 這裡的yo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...