亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python的進(jìn)程及進(jìn)程池詳解

 更新時間:2021年11月25日 15:04:29   作者:程序員-夏天  
這篇文章主要為大家介紹了Python的進(jìn)程及進(jìn)程池,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

進(jìn)程

進(jìn)程是操作系統(tǒng)分配資源的基本單元,是程序隔離的邊界。

進(jìn)程和程序

程序只是一組指令的集合,它本身沒有任何運(yùn)行的含義,它是靜態(tài)的。

進(jìn)程程序的執(zhí)行實(shí)例,是動態(tài)的,有自己的生命周期,有創(chuàng)建有撤銷,存在是暫時的。

進(jìn)程和程序不是一一對應(yīng)的,一個程序可以對應(yīng)多個進(jìn)程,一個進(jìn)程也可以執(zhí)行一個或者多個程序。

我們可以這樣理解:編寫完的代碼,沒有運(yùn)行時稱為程序,正在運(yùn)行的代碼,會啟動一個(或多個)進(jìn)程。

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

在我們的操作系統(tǒng)?作時,任務(wù)數(shù)往往?于cpu核心數(shù),即?定有?些任務(wù)正在執(zhí)?,?另外?些任務(wù)在等待cpu,因此導(dǎo)致了進(jìn)程有不同的狀態(tài)。

  • 就緒狀態(tài):已滿?運(yùn)?條件,等待cpu執(zhí)?
  • 執(zhí)?狀態(tài):cpu正在執(zhí)?
  • 等待狀態(tài):等待某些條件滿?,比如?個程序sleep了,此時就處于等待狀態(tài)

Python中的進(jìn)程

在Python中,進(jìn)程是通過multiprocessing多進(jìn)程模塊來創(chuàng)建的,multiprocessing模塊提供了?個Process類來創(chuàng)建進(jìn)程對象。

創(chuàng)建?進(jìn)程

Process語法結(jié)構(gòu):

Process(group, target, name, args, kwargs)

  • group:指定進(jìn)程組,?多數(shù)情況下?不到
  • target:表示調(diào)用對象,即子進(jìn)程要執(zhí)行的任務(wù)
  • name:子進(jìn)程的名稱,可以不設(shè)定
  • args:給target指定的函數(shù)傳遞的參數(shù),以元組的?式傳遞
  • kwargs:給target指定的函數(shù)傳遞命名參數(shù)

Process常用方法

  • p.start() 啟動進(jìn)程,并調(diào)用該子進(jìn)程中的p.run()方法
  • p.join(timeout):主進(jìn)程等待?進(jìn)程執(zhí)?結(jié)束再結(jié)束,timeout是可選的超時時間
  • is_alive():判斷進(jìn)程?進(jìn)程是否還存活
  • p.run() 進(jìn)程啟動時運(yùn)行的方法,正是它去調(diào)用target指定的函數(shù)
  • p.terminate() ?即終??進(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 os
import time
def work(name):
    print("子進(jìn)程work正在運(yùn)行......")
    time.sleep(0.5)
    print(name)
    # 獲取進(jìn)程的名稱
    print("子進(jìn)程name", multiprocessing.current_process())
    # 獲取進(jìn)程的pid
    print("子進(jìn)程pid", multiprocessing.current_process().pid, os.getpid())
    # 獲取父進(jìn)程的pid
    print("父進(jìn)程pid", os.getppid())
    print("子進(jìn)程運(yùn)行結(jié)束......")
if __name__ == '__main__':
    print("主進(jìn)程啟動")
    # 獲取進(jìn)程的名稱
    print("主進(jìn)程name", multiprocessing.current_process())
    # 獲取進(jìn)程的pid
    print("主進(jìn)程pid", multiprocessing.current_process().pid, os.getpid())
    # 創(chuàng)建進(jìn)程
    p = multiprocessing.Process(group=None, target=work, args=("tigeriaf", ))
    # 啟動進(jìn)程
    p.start()
    print("主進(jìn)程結(jié)束")

通過上述代碼我們發(fā)現(xiàn),multiprocessing.Process幫我們創(chuàng)建一個子進(jìn)程,并且成功運(yùn)行,但是我們發(fā)現(xiàn),在子進(jìn)程還沒執(zhí)行完的時候主進(jìn)程就已經(jīng)死了,那么這個子進(jìn)程在主進(jìn)程結(jié)束后就是一個孤兒進(jìn)程,那么我們可以讓主進(jìn)程等待子進(jìn)程結(jié)束后再結(jié)束嗎?答案是可以的。 那就是通過p.join(),join()的作用是讓主進(jìn)程等子進(jìn)程執(zhí)行完再退出。

import multiprocessing
import os
import time
def work(name):
    print("子進(jìn)程work正在運(yùn)行......")
    time.sleep(0.5)
    print(name)
    # 獲取進(jìn)程的名稱
    print("子進(jìn)程name", multiprocessing.current_process())
    # 獲取進(jìn)程的pid
    print("子進(jìn)程pid", multiprocessing.current_process().pid, os.getpid())
    # 獲取父進(jìn)程的pid
    print("父進(jìn)程pid", os.getppid())
    print("子進(jìn)程運(yùn)行結(jié)束......")
if __name__ == '__main__':
    print("主進(jìn)程啟動")
    # 獲取進(jìn)程的名稱
    print("主進(jìn)程name", multiprocessing.current_process())
    # 獲取進(jìn)程的pid
    print("主進(jìn)程pid", multiprocessing.current_process().pid, os.getpid())
    # 創(chuàng)建進(jìn)程
    p = multiprocessing.Process(group=None, target=work, args=("tigeriaf", ))
    # 啟動進(jìn)程
    p.start()
    p.join()
    print("主進(jìn)程結(jié)束")

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

可以看出,主進(jìn)程是在子進(jìn)程結(jié)束后才結(jié)束的。

全局變量問題

全局變量在多個進(jìn)程中不共享,進(jìn)程之間的數(shù)據(jù)是獨(dú)立的,默認(rèn)情況下互不影響。

import multiprocessing
# 定義全局變量
num = 99
def work1():
    print("work1正在運(yùn)行......")
    global num   # 在函數(shù)內(nèi)部聲明使?全局變量num
    num = num + 1  # 對num值進(jìn)?+1
    print("work1 num = {}".format(num))
def work2():
    print("work2正在運(yùn)行......")
    print("work2 num = {}".format(num))
if __name__ == '__main__':
    # 創(chuàng)建進(jìn)程p1
    p1 = multiprocessing.Process(group=None, target=work1)
    # 啟動進(jìn)程p1
    p1.start()
    # 創(chuàng)建進(jìn)程p2
    p2 = multiprocessing.Process(group=None, target=work2)
    # 啟動進(jìn)程p2
    p2.start()

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

從運(yùn)?結(jié)果可以看出,work1()函數(shù)對全局變量num的修改,在work2中并沒有獲取到,?還是原來的99,所以,進(jìn)程之間是不夠共享變量的。

守護(hù)進(jìn)程

上面說到,可以使用p.join()讓主進(jìn)程等待子進(jìn)程結(jié)束后再結(jié)束,那么可不可以讓子進(jìn)程在主進(jìn)程結(jié)束的時候就結(jié)束呢?答案是肯定的。 我們可以使用p.daemon = True或者p2.terminate()進(jìn)行設(shè)置:

import multiprocessing
import time
def work1():
    print("work1正在運(yùn)行......")
    time.sleep(4)
    print("work1運(yùn)行完畢")
def work2():
    print("work2正在運(yùn)行......")
    time.sleep(10)
    print("work2運(yùn)行完畢")
if __name__ == '__main__':
    # 創(chuàng)建進(jìn)程p1
    p1 = multiprocessing.Process(group=None, target=work1)
    # 啟動進(jìn)程p1
    p1.start()
    # 創(chuàng)建進(jìn)程p2
    p2 = multiprocessing.Process(group=None, target=work2)
    # 設(shè)置p2守護(hù)主進(jìn)程
    # 第?種?式
    # p2.daemon = True  在start()之前設(shè)置,不然會拋異常
    # 啟動進(jìn)程p2
    p2.start()
    time.sleep(2)
    print("主進(jìn)程運(yùn)行完畢!")
    # 第?種?式 
    p2.terminate()

執(zhí)行結(jié)果如下:

由于p2設(shè)置了守護(hù)主進(jìn)程,所以主進(jìn)程運(yùn)行完畢后,p2子進(jìn)程也隨之結(jié)束,work2任務(wù)停止,而work1繼續(xù)運(yùn)行至結(jié)束。

進(jìn)程池

當(dāng)需要創(chuàng)建的?進(jìn)程數(shù)量不多時, 可以直接利?multiprocessing.Process動態(tài)生成多個進(jìn)程, 但如果要創(chuàng)建很多進(jìn)程時,?動創(chuàng)建的話?作量會非常大,此時就可以?到multiprocessing模塊提供的Pool去創(chuàng)建一個進(jìn)程池。

multiprocessing.Pool常?函數(shù):

  • apply_async(func, args, kwds):使??阻塞?式調(diào)?func(任務(wù)并?執(zhí)?),args為傳遞給func的參數(shù)列表,kwds為傳遞給func的關(guān)鍵字參數(shù)列表
  • apply(func, args, kwds):使?阻塞?式調(diào)?func,必須等待上?個進(jìn)程執(zhí)行完任務(wù)后才能執(zhí)?下?個進(jìn)程,了解即可,幾乎不用
  • close():關(guān)閉Pool,使其不再接受新的任務(wù)
  • terminate():不管任務(wù)是否完成,?即終?
  • join():主進(jìn)程阻塞,等待?進(jìn)程的退出,必須在close或terminate之后使?

初始化Pool時,可以指定?個最?進(jìn)程數(shù),當(dāng)有新的任務(wù)提交到Pool中時,如果進(jìn)程池還沒有滿,那么就會創(chuàng)建?個新的進(jìn)程?來執(zhí)?該任務(wù),但如果進(jìn)程池已滿(池中的進(jìn)程數(shù)已經(jīng)達(dá)到指定的最?值),那么該任務(wù)就會等待,直到池中有進(jìn)程結(jié)束才會創(chuàng)建新的進(jìn)程來執(zhí)?。

from multiprocessing import Pool
import time
def work(i):
    print("work'{}'執(zhí)行中......".format(i), multiprocessing.current_process().name, multiprocessing.current_process().pid)
    time.sleep(2)
    print("work'{}'執(zhí)行完畢......".format(i))
if __name__ == '__main__':
    # 創(chuàng)建進(jìn)程池
    # Pool(3) 表示創(chuàng)建容量為3個進(jìn)程的進(jìn)程池
    pool = Pool(3)
    for i in range(10):
        # 利?進(jìn)程池同步執(zhí)?work任務(wù),進(jìn)程池中的進(jìn)程會等待上?個進(jìn)程執(zhí)行完任務(wù)后才能執(zhí)?下?個進(jìn)程
        # pool.apply(work, (i, ))
        # 使?異步?式執(zhí)?work任務(wù)
        pool.apply_async(work, (i, ))
    # 進(jìn)程池關(guān)閉之后不再接受新的請求
    pool.close()
    # 等待po中所有子進(jìn)程結(jié)束,必須放在close()后面, 如果使?異步?式執(zhí)?work任務(wù),主線程不再等待?線程執(zhí)?完畢再退出!
    pool.join()

執(zhí)行結(jié)果為:

從結(jié)果我們可以看出,只有3個子進(jìn)程在執(zhí)行任務(wù),此處我們使用的是異步?式(pool.apply_async(work, (i, )))執(zhí)?work任務(wù),如果是以同步方式(pool.apply(work, (i, )))執(zhí)行,進(jìn)程池中的進(jìn)程會等待上?個進(jìn)程執(zhí)行完任務(wù)后才能執(zhí)?下?個進(jìn)程。

總結(jié)

本篇只介紹了什么是進(jìn)程、進(jìn)程與程序的關(guān)系、進(jìn)程的創(chuàng)建與使用、創(chuàng)建進(jìn)程池等,并沒有介紹進(jìn)程同步及進(jìn)程通信等,下篇文章將會介紹。

相關(guān)文章

  • django數(shù)據(jù)關(guān)系一對多、多對多模型、自關(guān)聯(lián)的建立

    django數(shù)據(jù)關(guān)系一對多、多對多模型、自關(guān)聯(lián)的建立

    這篇文章主要介紹了django數(shù)據(jù)關(guān)系一對多、多對多模型、自關(guān)聯(lián)的建立
    2019-07-07
  • Python?命令行?prompt_toolkit?庫詳解

    Python?命令行?prompt_toolkit?庫詳解

    prompt_toolkit 是一個用于構(gòu)建強(qiáng)大交互式命令行的 Python 工具庫。接下來通過本文給大家介紹Python?命令行?prompt_toolkit?庫的相關(guān)知識,感興趣的朋友一起看看吧
    2022-01-01
  • 用Python畫一個LinkinPark的logo代碼實(shí)例

    用Python畫一個LinkinPark的logo代碼實(shí)例

    這篇文章主要介紹了用Python畫一個LinkinPark的logo代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python-OpenCV基本操作方法詳解

    Python-OpenCV基本操作方法詳解

    下面小編就為大家分享一篇Python-OpenCV基本操作方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python引入其他文件夾下的py文件具體方法

    python引入其他文件夾下的py文件具體方法

    在本篇文章里小編給大家整理的是一篇關(guān)于python引入其他文件夾下的py文件具體方法,有興趣朋友們可以跟著學(xué)習(xí)參考下。
    2021-05-05
  • Python實(shí)現(xiàn)訪問者模式詳情

    Python實(shí)現(xiàn)訪問者模式詳情

    這篇文章主要介紹了Python實(shí)現(xiàn)訪問者模式詳情,訪問者模式,指作用于一個對象結(jié)構(gòu)體上的元素的操作。訪問者可以使用戶在不改變該結(jié)構(gòu)體中的類的基礎(chǔ)上定義一個新的操作,下文更多相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Python3中zip()函數(shù)知識點(diǎn)小結(jié)

    Python3中zip()函數(shù)知識點(diǎn)小結(jié)

    本文主要介紹了Python3中zip()函數(shù)知識點(diǎn)小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python實(shí)現(xiàn)的接收郵件功能示例【基于網(wǎng)易POP3服務(wù)器】

    python實(shí)現(xiàn)的接收郵件功能示例【基于網(wǎng)易POP3服務(wù)器】

    這篇文章主要介紹了python實(shí)現(xiàn)的接收郵件功能,結(jié)合實(shí)例形式分析了Python基于網(wǎng)易POP3服務(wù)器接收郵件相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • Django REST為文件屬性輸出完整URL的方法

    Django REST為文件屬性輸出完整URL的方法

    這篇文章主要給大家介紹了關(guān)于Django REST如何為文件屬性輸出完整URL的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-12-12
  • 關(guān)于Python 的簡單柵格圖像邊界提取方法

    關(guān)于Python 的簡單柵格圖像邊界提取方法

    今天小編就為大家分享一篇關(guān)于Python 的簡單柵格圖像邊界提取方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論