欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python進(jìn)程multiprocessing.Process()的使用解讀

 更新時間:2024年02月24日 09:32:40   作者:埃菲爾沒有塔尖  
這篇文章主要介紹了Python進(jìn)程multiprocessing.Process()的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1.進(jìn)程概念

進(jìn)程是資源分配的最小單位,程序隔離的邊界。


CPU的時間片輪轉(zhuǎn),在不同的時間段切換執(zhí)行不同的進(jìn)程,但是切換進(jìn)程是比較耗時的;就引來了輕量級進(jìn)程,也就是所謂的線程,一個進(jìn)程中包括多個線程(代碼流,其實(shí)也就是進(jìn)程中同時跑的多個方法體)

  • 程序:例如xxx.py這是程序,是一個靜態(tài)的
  • 進(jìn)程:一個程序運(yùn)行起來后,代碼+用到的資源 稱之為進(jìn)程,它是操作系統(tǒng)分配資源的基本單元。

2.進(jìn)程的狀態(tài)

工作中,任務(wù)數(shù)往往大于cpu的核數(shù),即一定有一些任務(wù)正在執(zhí)行,而另外一些任務(wù)在等待cpu進(jìn)行執(zhí)行,因此導(dǎo)致了有了不同的狀態(tài)


  • 就緒態(tài):運(yùn)行的條件都已經(jīng)滿足,正在等在cpu執(zhí)行
  • 執(zhí)行態(tài):cpu正在執(zhí)行其功能
  • 等待態(tài):等待某些條件滿足,例如一個程序sleep了,此時就處于等待態(tài)

3.進(jìn)程的創(chuàng)建-multiprocessing

multiprocessing模塊就是跨平臺版本的多進(jìn)程模塊,提供了一個Process類來代表一個進(jìn)程對象,這個對象可以理解為是一個獨(dú)立的進(jìn)程,可以執(zhí)行另外的事情。

方法說明:

創(chuàng)建子進(jìn)程跟創(chuàng)建線程十分類似,只需要傳入一個執(zhí)行函數(shù)和函數(shù)的參數(shù),創(chuàng)建一個Process實(shí)例,用start()方法啟動。

Process語法結(jié)構(gòu)如下: Process([group [, target [, name [, args [, kwargs]]]]])

  • target:如果傳遞了函數(shù)的引用,這個子進(jìn)程就執(zhí)行這里(函數(shù))的代碼
  • args:給target指定的函數(shù)傳遞的參數(shù),以元組的方式傳遞
  • kwargs:給target指定的函數(shù)傳遞命名參數(shù)
  • name:給進(jìn)程設(shè)定一個名字,可以不設(shè)定 group:指定進(jìn)程組,大多數(shù)情況下用不到

Process創(chuàng)建的實(shí)例對象的常用方法:

  • start():啟動子進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程)
  • is_alive():判斷進(jìn)程子進(jìn)程是否還在活著
  • join([timeout]):是否等待子進(jìn)程執(zhí)行結(jié)束,或等待多少秒
  • terminate():不管任務(wù)是否完成,立即終止子進(jìn)程

Process創(chuàng)建的實(shí)例對象的常用屬性:

  • name:當(dāng)前進(jìn)程的別名,默認(rèn)為Process-N,N為從1開始遞增的整數(shù)
  • pid:當(dāng)前進(jìn)程的pid(進(jìn)程號)

代碼示例:

import multiprocessing
import time

def work1():
    for i in range(10):
        print("work1----", i)
        time.sleep(0.5)

if __name__ == '__main__':
    # 創(chuàng)建進(jìn)程
    # 1. 導(dǎo)入 multiprocessing 模塊
    # 2. multiprocessing.Process() 創(chuàng)建子進(jìn)程
    # 3. start() 方法啟動進(jìn)程

    p1 = multiprocessing.Process(group=None, target=work1)
    p1.start()

    for i in range(10):
        print("這是主進(jìn)程", i)
        time.sleep(0.5)

4.進(jìn)程名稱獲取

multiprocessing.current_process()


5. 獲取進(jìn)程pid

有兩種方法可以獲取

1)multiprocessing.current_process().pid

2)使用import os模塊的getpid()

import multiprocessing
import time
import os

def work():
    # 獲取進(jìn)程的名稱
    print(multiprocessing.current_process())
    # 獲取進(jìn)程的pid
    print(multiprocessing.current_process().pid, os.getpid())

    i = 0
    while i < 10:
        print("work中執(zhí)行", i)
        time.sleep(0.5)
        i = i + 1

if __name__ == '__main__':
    # 獲取進(jìn)程的pid
    print(multiprocessing.current_process())
    # 創(chuàng)建子進(jìn)程
    process1 = multiprocessing.Process(group=None, target=work)
    process1.start()

    i = 0
    while i < 10:
        print("我在主線程中執(zhí)行",i)
        time.sleep(0.3)
        i = i + 1


 

獲取父id: getppid() 獲取父進(jìn)程id

6.子進(jìn)程參數(shù)傳遞

給子進(jìn)程傳遞參數(shù)方法和給子線程傳遞參數(shù)方法基本一致!


7.進(jìn)程間不共享全局變量

import multiprocessing
# 定義全局變量
num = 100

# 定義work方法,設(shè)置num1的值
def work():
    global num       # 在函數(shù)內(nèi)部聲明使用全局變量num
    num = num + 1    # 對num值進(jìn)行+1
    print("work num = %d" % num)

# 定義work2方法,獲取num1的值
def work2():
    print("work2 num = %d" % num)

if __name__ == '__main__':
    # 創(chuàng)建子進(jìn)程
    process1 = multiprocessing.Process(group=None, target=work, name="MyProcess")
    process1.start()

    # 創(chuàng)建第二個子進(jìn)程
    process2 = multiprocessing.Process(group=None, target=work2, name="MyProcess2")
    process2.start()

運(yùn)行結(jié)果:

work num = 101
work2 num = 100

由運(yùn)行結(jié)果可以看出,work函數(shù)對num1的修改,在work2中并沒有獲取到,而還是原來的100,所以,進(jìn)程之間是不能夠共享變量的

8.守護(hù)主進(jìn)程

import multiprocessing
import time

def sub_process():
    for i in range(10):
        print("子進(jìn)程運(yùn)行中", i)
        time.sleep(0.5)

if __name__ == '__main__':
    # 創(chuàng)建子進(jìn)程
    p1 = multiprocessing.Process(group=None, target=sub_process, name="p1")
    # 設(shè)置守護(hù)主進(jìn)程
    # 第一種方式:
    # p1.daemon = True
    # 第二種方式(最好在退出exit()前一句使用):
    # p1.terminate()
    # 啟動
    p1.start()

    time.sleep(2)
    print("OVER!")
    p1.terminate()
    exit()

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 實(shí)現(xiàn)順序高斯消元法示例

    Python 實(shí)現(xiàn)順序高斯消元法示例

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)順序高斯消元法示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 教你如何用pycharm安裝pyqt5及其相關(guān)配置

    教你如何用pycharm安裝pyqt5及其相關(guān)配置

    這篇文章主要介紹了教你如何用pycharm安裝pyqt5及其相關(guān)配置,首先通過單獨(dú)創(chuàng)建一個文件夾來專門存放pyqt5的代碼并建立虛擬環(huán)境展開文章敘述,需要的小伙伴可以參考一下
    2022-04-04
  • python實(shí)現(xiàn)盲盒抽獎功能(減庫存)

    python實(shí)現(xiàn)盲盒抽獎功能(減庫存)

    本文主要介紹了python實(shí)現(xiàn)盲盒抽獎功能,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python實(shí)戰(zhàn)基礎(chǔ)之Pandas統(tǒng)計某個數(shù)據(jù)列的空值個數(shù)

    Python實(shí)戰(zhàn)基礎(chǔ)之Pandas統(tǒng)計某個數(shù)據(jù)列的空值個數(shù)

    我們在處理數(shù)據(jù)的時候,經(jīng)常需要檢查數(shù)據(jù)的質(zhì)量,也需要知道出問題的數(shù)據(jù)在哪個位置,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)基礎(chǔ)之利用Pandas統(tǒng)計某個數(shù)據(jù)列空值個數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Python圖像運(yùn)算之圖像點(diǎn)運(yùn)算與灰度化處理詳解

    Python圖像運(yùn)算之圖像點(diǎn)運(yùn)算與灰度化處理詳解

    這篇文章主要介紹了圖像點(diǎn)運(yùn)算的灰度化處理的相關(guān)知識,包括各種灰度算法的實(shí)現(xiàn),以及灰度線性變換和灰度非線性變換。需要的可以參考一下
    2022-02-02
  • 基于Django框架的權(quán)限組件rbac實(shí)例講解

    基于Django框架的權(quán)限組件rbac實(shí)例講解

    今天小編就為大家分享一篇基于Django框架的權(quán)限組件rbac實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Django mysqlclient安裝和使用詳解

    Django mysqlclient安裝和使用詳解

    這篇文章主要介紹了Django mysqlclient安裝和使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 全面解析Python的While循環(huán)語句的使用方法

    全面解析Python的While循環(huán)語句的使用方法

    這篇文章主要介紹了全面解析Python的While循環(huán)語句的使用方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 基于Python的A*算法解決八數(shù)碼問題實(shí)現(xiàn)步驟

    基于Python的A*算法解決八數(shù)碼問題實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了關(guān)于如何基于Python的A*算法解決八數(shù)碼問題的實(shí)現(xiàn)步驟,文中介紹了八數(shù)碼問題及其求解方法,通過啟發(fā)式搜索算法,特別是A*算法,可以有效地解決八數(shù)碼問題,,需要的朋友可以參考下
    2024-11-11
  • PyQt信號和槽機(jī)制的具體使用

    PyQt信號和槽機(jī)制的具體使用

    信號和槽機(jī)制是一種通信機(jī)制,在PyQt中,信號是一種特殊的函數(shù),它可以傳遞任何類型的數(shù)據(jù),而槽則是一種接收信號的函數(shù),本文就介紹了PyQt信號和槽機(jī)制的具體使用,感興趣的可以了解一下
    2023-08-08

最新評論