python中進程的幾種創建方式

来源:https://www.cnblogs.com/djdjdj123/archive/2023/06/28/17512736.html
-Advertisement-
Play Games

在新創建的子進程中,會把父進程的所有信息複製一份,它們之間的數據互不影響。 ### 1.使用os.fork()創建 該方式只能用於Unix/Linux操作系統中,在windows不能用。 ```python import os # 註意,fork函數,只在Unix/Linux/Mac上運行,wind ...


在新創建的子進程中,會把父進程的所有信息複製一份,它們之間的數據互不影響。

1.使用os.fork()創建

該方式只能用於Unix/Linux操作系統中,在windows不能用。

import os

# 註意,fork函數,只在Unix/Linux/Mac上運行,windows不可以
pid = os.fork()
# 子進程永遠返回0,而父進程返回子進程的ID。
if pid == 0:
    print('子進程')
else:
    print('父進程')

2.使用Process類類創建

multiprocessing模塊提供了一個Process類來代表一個進程對象,下麵的例子演示了啟動一個子進程並等待其結束:

from multiprocessing import Process
import time
 
def test(name, age):
    for i in range(5):
        print("--test--%s\t%d" % (name, age))
        time.sleep(1)
    print("子進程結束")
 
 
if __name__ == '__main__':
    p = Process(target=test, args=("aaa", 18))
    p.start()
    # 等待進程實例執⾏結束,或等待多少秒;
    p.join() # 等待的最長時間
    print("主進程結束")
"""
輸出結果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子進程結束
主進程結束
"""

join()方法表示主進程等待子進程執行完成後繼續往下執行,如果把join()註釋掉,則主進程開啟子進程後不停頓繼續往下執行,然後等待子進程完成程式結束。
把join()方法註釋掉的結果:

"""
輸出結果:
主進程結束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子進程結束
"""

3.使用Process子類創建

創建新的進程還能夠使用類的方式,可以自定義一個類,繼承Process類,每次實例化這個類的時候,就等同於實例化一個進程對象,請看下麵的實例:

from multiprocessing import Process
import time
import os
 
 
class MyProcess(Process):
 
    def __init__(self):
        # 如果子類要重寫__init__是必須要先調用父類的__init__否則會報錯
        # Process.__init__(self)  
        super(MyProcess,self).__init__()
 	# 學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
    # 重寫Porcess的run()方法
    def run(self):
        print("子進程(%s)開始執行,父進程(%s)" % (os.getpid(), os.getppid()))
        for i in range(5):
            print("--1--")
            time.sleep(1)
 
 
if __name__ == '__main__':
    t_start = time.time()
    p = MyProcess()
    p.start()
    # p.join()
    print("main")
    for i in range(5):
        print("--main--")
        time.sleep(1)

4.使用進程池Pool創建

當需要創建的子進程數量不多時,可以直接利用multiprocessing中的Process動態成生多個進程,但如果是上百甚至上千個目標,手動的去創建進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。

初始化Pool時,可以指定一個最大進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到指定的最大值,那麼該請求就會等待,直到池中有進程結束,才會創建新的進程來執行,請看下麵的實例:

from multiprocessing import Pool
import os
import time
 
 
def worker(num):
    # for i in range(3):
    print("----pid=%d  num=%d---" % (os.getpid(), num))
    time.sleep(1)
 
if __name__ == '__main__':
    # 定義一個進程池,最大進程數3
    pool = Pool(3)
    for i in range(10):
        print("---%d--" % i)
        # 使用非阻塞方式調用func(並行執行),一般用這個。
        # apply堵塞方式必須等待上一個進程退出才能執行下一個進程,用的不多。
        pool.apply_async(worker, (i,))
    # 關閉進程池
    pool.close()
    # 等待所有子進程結束,主進程一般用來等待
    pool.join()  # 進程池後面無操作時必須有這句

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

-Advertisement-
Play Games
更多相關文章
  • 摘要:在本篇文章中,我們將深入探討Spring框架中的重要組件——BeanPostProcessor。首先,我們將瞭解其設計理念和目標,然後通過實際的例子學習如何基礎使用它,如何通過BeanPostProcessor改變Bean的初始化結果以及如何利用它修改Bean的屬性。 本文分享自華為雲社區《S ...
  • [回到目錄](https://www.cnblogs.com/lori/p/3896484.html) # 概述 委派模式(Delegate Pattern)又叫作委托模式,是一種面向對象的設計模式,允許對象組合實現與繼承相同的代碼重用。它的基本作用就是負責任務的調用和分配,是一種特殊的靜態代理模式 ...
  • [回到目錄](https://www.cnblogs.com/lori/p/3896484.html) # 責任鏈模式 它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對於工作流應用是一個不錯的選擇! 下麵是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式 ...
  • 在筆者上一篇文章`《驅動開發:內核取應用層模塊基地址》`中簡單為大家介紹瞭如何通過遍歷`PLIST_ENTRY32`鏈表的方式獲取到`32位`應用程式中特定模塊的基地址,由於是入門系列所以並沒有封裝實現太過於通用的獲取函數,本章將繼續延申這個話題,並依次實現通用版`GetUserModuleBase... ...
  • 水滿則溢,月盈則虧,任何事物都不可能無限制的發展,我們的系統服務能力也一樣。 當隨著流量的不斷增長,達到或超過服務本身的可承載範圍,系統服務的自我保護機制的建立就顯得很重要了。 本文希望可以用最通俗的解釋和貼切的實例來帶大家瞭解什麼是限流、降級和熔斷。 ...
  • ## 前言 函數是C語言中的基本構建塊之一,它允許我們將代碼組織成可重用、模塊化的單元。 本文將逐步介紹C語言函數的基礎概念、參數傳遞、返回值、遞歸以及內聯函數和匿名函數。 ## 一、人物簡介 - 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 ![](https://img2023 ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第27面: > 面試官:知道`std::unordered_set/std::unordered_map`嗎? > > 二師兄:知道。兩者都是C++11引入的新容器,和`std::set`和`std::map`功能類似,`key`唯一,`unorde ...
  • 在用 Flask 寫一個項目,後臺管理用的插件暫時是 flask-admin。想實現的效果:在後臺管理頁面中,把提交到後端的圖片不保存在 static 文件夾下麵,而是通過後端代碼把這個文件對象上傳到 AWS 的 S3中存儲。 通過flask-admin 上傳到後端的文件對象的類型是: ```pyt ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...