多進(jìn)程知識點總結(jié)1

1.fork函數(shù)

此處需要注意的是

當(dāng)調(diào)用fork方法 ,之后的代碼會運(yùn)行兩次
os 中的fork只能在liunx中使用
fork方法有一個返回值。若為0表示子進(jìn)程
獲取子進(jìn)程的編號 os.getpid 獲取父進(jìn)程的編號

實例:

"""
os 中的fork只能在liunx中使用
"""

import os
print("daima")
# 運(yùn)行一個子進(jìn)程

# 當(dāng)調(diào)用fork方法 ,之后的代碼會運(yùn)行兩次
re = os.fork()
print("res = ",re)
# fork方法有一個返回值。若為0表示子進(jìn)程
if re == 0:
# 獲取子進(jìn)程的編號 os.getpid  獲取父進(jìn)程的編號os.getppid
    print("子",os.getpid(),os.getppid())
else:
    print("主",os.getpid())

print("代碼完成")
======================================================

os.fork()
os.getpid()
os.getppid()
2.全局變量問題

全局變量不共享,進(jìn)程獨自占有一份

實例:

import os

num = 10

def sum1():
    print("111")
    global num
    num += 10
    print("unm")

def sum2():
    print("22222")
    global num
    num += 10
    print(num)

res = os.fork()
if res == 0:
    print("子進(jìn)程運(yùn)行")
    sum1()

else:
    print("主進(jìn)程運(yùn)行")
    sum2()

print("程序運(yùn)行結(jié)束")

3.多個fork問題

遇見fork將一個進(jìn)程開辟成兩個

實例

import os

res = os.fork()
if res == 0:
    print("1")
else:
    print("2")

res2 = os.fork()
if res2 == 0:
    print("3")
else:
    print("4")

print("程序運(yùn)行結(jié)束")

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


image.png
4.window環(huán)境下使用multiprocessing

我們使用os.fork()方法實現(xiàn)了多進(jìn)程,但是這種方案只能在Linux下運(yùn)行,window環(huán)境下是無法運(yùn)行的,那么有沒有可以實現(xiàn)在任何平臺都能運(yùn)行的多進(jìn)程了,有!Python為大家提供了multiprocessing模塊用來實現(xiàn)多進(jìn)程。

multiprocessing模塊實例:

主進(jìn)程不變,創(chuàng)建子進(jìn)程
from multiprocessing import Process
import time
import os

def download(path):
    print("開始下載")
    for x in range(5):
        print("%s開始下載中……" %path)
        print(os.getpid())
        print(os.getppid())
        time.sleep(1)
    print("下載結(jié)束")

def printMsg(msg):
    print("開始打印")
    for x in range(5):
        print("打印中……%s" % msg)
        print(os.getpid())
        print(os.getppid())
        time.sleep(1)
    print("打印結(jié)束")

if __name__ == '__main__':
    start_time = time.time()
    print("程序開始運(yùn)行了")
    # download("www.xxx.com")
    # 多進(jìn)程
    # 構(gòu)建進(jìn)程對象
    t1 = Process(target=download, args=("www.xxx.com",), name="download")

    # 啟動進(jìn)程
    t1.start()
    # 構(gòu)建進(jìn)程對象
    t2 = Process(target=printMsg, args=("劉建宏真帥,今天天氣真熱??!",), name="print")
    # 啟動進(jìn)程
    t2.start()

    print("程序結(jié)束", time.time() - start_time)

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

image.png
5.多進(jìn)程中常見方法

啟動進(jìn)程

t1.start()

守護(hù)進(jìn)程放在start之前 ,把這個進(jìn)程注冊成守護(hù)進(jìn)行
守護(hù)進(jìn)程依賴于主進(jìn)程存活,主進(jìn)程結(jié)束守護(hù)進(jìn)程結(jié)束

t1.daemon = True

獲取進(jìn)程名稱.在多進(jìn)程中,子進(jìn)程名字默認(rèn)是Process - n

print(t1.name)

判斷進(jìn)程是否被殺死

if t1.is_alive():
    print(t1.is_alive())

殺死進(jìn)程

    t1.terminate()

進(jìn)程對象的join方法,使主進(jìn)程等待當(dāng)前子進(jìn)程運(yùn)行結(jié)束后再進(jìn)行運(yùn)行

t1.join()

綜合實例:

def run(msg):
    for x in range(10):
        print("一個子進(jìn)程")
        print(msg)
        print("子進(jìn)程結(jié)束")
        time.sleep(1)

if __name__ == '__main__':
    print("主進(jìn)程開始")
    t1 = Process(target=run, args="1", name="zi")
    t2 = Process(target=run, args="2", name="zi1")

    # 守護(hù)進(jìn)程放在start之前 ,把這個進(jìn)程注冊成守護(hù)進(jìn)行
    # 守護(hù)進(jìn)程依賴于主進(jìn)程存活,主進(jìn)程結(jié)束守護(hù)進(jìn)程結(jié)束
    t1.daemon = True

    # 啟動進(jìn)程
    t1.start()
    t2.start()

    # 獲取進(jìn)程名稱
    # 在多進(jìn)程中,子進(jìn)程名字默認(rèn)是Process - n
    print(t1.name)
    print(t2.name)

    # 判斷進(jìn)程是否被殺死
    if t1.is_alive():
        print(t1.is_alive())
        # 殺死進(jìn)程
        t1.terminate()

    # 進(jìn)程對象的join方法,使主進(jìn)程等待當(dāng)前
    # 子進(jìn)程運(yùn)行結(jié)束后再進(jìn)行運(yùn)行
    t1.join()

    print("zhu")
6.進(jìn)程類

進(jìn)程的實現(xiàn):
1.需要基礎(chǔ)multiprocessing模塊中Process類
2.重寫run方法,run方法就是我們要執(zhí)行的方法

from multiprocessing import Process
import time
"""
進(jìn)程的實現(xiàn):
     1.需要基礎(chǔ)multiprocessing模塊中Process類
     2.重寫run方法,run方法就是我們要執(zhí)行的方法
"""


class MyProcess(Process):

    def __init__(self, name, age):
        # 第一個參數(shù)是進(jìn)程的名字不能寫成普通參數(shù),固定寫法
        super().__init__(name=name)
        self.age = age

# RUN方法就是進(jìn)程需要的執(zhí)行的方法
    def run(self):
        print("獨立子進(jìn)程")
        time.sleep(1)
        print("子進(jìn)程結(jié)束")

if __name__ == '__main__':
    print("主進(jìn)程開始")
    m1 = MyProcess("1", "2")
    m1.start()
    print("主進(jìn)程結(jié)束")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口,提供良好的抽象接口。 管理調(diào)度進(jìn)程,并將多個進(jìn)程對硬件...
    drfung閱讀 3,762評論 0 5
  • 現(xiàn)在, 多核CPU已經(jīng)非常普及了, 但是, 即使過去的單核CPU, 也可以執(zhí)行多任務(wù)。 CPU執(zhí)行代碼都是順序執(zhí)行...
    LittlePy閱讀 4,928評論 0 3
  • 1.進(jìn)程 1.1多線程的引入 現(xiàn)實生活中 有很多的場景中的事情是同時進(jìn)行的,比如開車的時候手和腳共同來駕駛汽車,再...
    TENG書閱讀 907評論 0 0
  • 文丨趙小冊 圖丨網(wǎng)絡(luò) 01 人和人之間的感覺蠻微妙的。這種感覺就像飄忽不定的天氣、或者飄忽不定的化學(xué)變化一樣。 也...
    趙小冊閱讀 375評論 0 0
  • 沒什么理由也沒什么原因。——你像條狗的原因只是你因為你真的很狗……真的。也有人對你噓寒問暖,但你遲鈍地不知道該做出...
    徐氏秋白閱讀 211評論 0 0

友情鏈接更多精彩內(nèi)容