国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python的進程及進程池詳解

Python的進程及進程池詳解

2022-03-08 00:08程序員-夏天 Python

這篇文章主要為大家介紹了Python的進程及進程池,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

 

進程

進程是操作系統分配資源的基本單元,是程序隔離的邊界。

 

進程和程序

程序只是一組指令的集合,它本身沒有任何運行的含義,它是靜態的。

進程程序的執行實例,是動態的,有自己的生命周期,有創建有撤銷,存在是暫時的。

進程和程序不是一一對應的,一個程序可以對應多個進程,一個進程也可以執行一個或者多個程序。

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

Python的進程及進程池詳解

 

進程的狀態

在我們的操作系統?作時,任務數往往?于cpu核心數,即?定有?些任務正在執?,?另外?些任務在等待cpu,因此導致了進程有不同的狀態。

Python的進程及進程池詳解

  • 就緒狀態:已滿?運?條件,等待cpu執?
  • 執?狀態:cpu正在執?
  • 等待狀態:等待某些條件滿?,比如?個程序sleep了,此時就處于等待狀態

 

Python中的進程

在Python中,進程是通過multiprocessing多進程模塊來創建的,multiprocessing模塊提供了?個Process類來創建進程對象。

 

創建?進程

Process語法結構:

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

  • group:指定進程組,?多數情況下?不到
  • target:表示調用對象,即子進程要執行的任務
  • name:子進程的名稱,可以不設定
  • args:給target指定的函數傳遞的參數,以元組的?式傳遞
  • kwargs:給target指定的函數傳遞命名參數

Process常用方法

  • p.start() 啟動進程,并調用該子進程中的p.run()方法
  • p.join(timeout):主進程等待?進程執?結束再結束,timeout是可選的超時時間
  • is_alive():判斷進程?進程是否還存活
  • p.run() 進程啟動時運行的方法,正是它去調用target指定的函數
  • p.terminate() ?即終??進程

Process創建的實例對象的常?屬性

name:當前進程的別名,默認為Process-N,N為從1開始遞增的整數

pid:當前進程的pid(進程號)

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

Python的進程及進程池詳解

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

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

運行結果:

Python的進程及進程池詳解

可以看出,主進程是在子進程結束后才結束的。

 

全局變量問題

全局變量在多個進程中不共享,進程之間的數據是獨立的,默認情況下互不影響。

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

運行結果:

Python的進程及進程池詳解

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

 

守護進程

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

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

執行結果如下:

Python的進程及進程池詳解

由于p2設置了守護主進程,所以主進程運行完畢后,p2子進程也隨之結束,work2任務停止,而work1繼續運行至結束。

 

進程池

當需要創建的?進程數量不多時, 可以直接利?multiprocessing.Process動態生成多個進程, 但如果要創建很多進程時,?動創建的話?作量會非常大,此時就可以?到multiprocessing模塊提供的Pool去創建一個進程池。

multiprocessing.Pool常?函數:

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

初始化Pool時,可以指定?個最?進程數,當有新的任務提交到Pool中時,如果進程池還沒有滿,那么就會創建?個新的進程?來執?該任務,但如果進程池已滿(池中的進程數已經達到指定的最?值),那么該任務就會等待,直到池中有進程結束才會創建新的進程來執?。

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

執行結果為:

Python的進程及進程池詳解

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

 

總結

本篇只介紹了什么是進程、進程與程序的關系、進程的創建與使用、創建進程池等,并沒有介紹進程同步及進程通信等,下篇文章將會介紹。

原文鏈接:https://blog.csdn.net/weixin_50097774/article/details/121428457

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久久久久久久冷 | 九九九九国产 | 91最新网址| 久久美女| 亚洲精品乱码久久久久久蜜糖图片 | 国产二区三区 | 91国内在线观看 | 日韩电影一区二区在线观看 | av一二三区 | 黄色片视频免费观看 | 51ⅴ精品国产91久久久久久 | 欧美国产精品一区二区三区 | 最新中文字幕在线 | 亚洲免费看片 | 中文二区 | 欧洲一级视频 | 国产精品欧美久久久久一区二区 | 日本女人高潮视频 | 在线观看免费成人av | 久久久91| 欧美一级在线视频 | 国产免费一区二区三区 | 免费成人高清在线视频 | 色中色综合| 欧美日韩在线一区二区三区 | 色版视频在线观看 | 亚洲综合无码一区二区 | 91精品国产乱码久久久久久 | 亚洲一二三 | 亚洲久久| 亚洲欧美在线观看 | 国产成人精品久久二区二区 | 久久福利电影 | 无毛av| 免费成人高清在线视频 | 爱爱视频网站 | 午夜精品一区二区三区在线播放 | 亚洲国产精品久久久久久 | 一本一本久久a久久精品综合妖精 | 韩日精品一区 | 久久香蕉国产视频 |