25.進(jìn)程和Process

進(jìn)程介紹和Process

1、什么是進(jìn)程
  • 一個(gè)程序運(yùn)行起來(lái)后门躯,它的代碼以及需要使用到的資源,稱之為進(jìn)程酷师,它是操作系統(tǒng)分配資源的基本單元讶凉,還是線程的容器,一個(gè)進(jìn)程中會(huì)有一個(gè)或多個(gè)線程
  • 不僅是可以通過(guò)線程來(lái)完成多任務(wù)操作山孔,進(jìn)程也是可以的
2懂讯、進(jìn)程的狀態(tài)
  • 工作中,任務(wù)數(shù)往往會(huì)大于CPU的核數(shù)饱须。那么肯定有一部分任務(wù)正在執(zhí)行域醇,而另外一部分任務(wù)在等待CPU的資源分配,因此就導(dǎo)致進(jìn)程會(huì)有不同的狀態(tài)
    a.就緒狀態(tài):運(yùn)行的條件都已經(jīng)滿足蓉媳,正在等待CPU的資源分配過(guò)來(lái)
    b.執(zhí)行狀態(tài):CPU正在執(zhí)行該進(jìn)程
    c.等待狀態(tài):在等待某些條件滿足譬挚。例如:一個(gè)程序正在sleep,此時(shí)就是等待狀態(tài)
3酪呻、進(jìn)程减宣、線程進(jìn)行對(duì)比
  • 功能
    a.進(jìn)程:能夠完成多任務(wù);比如在一臺(tái)電腦上能夠同時(shí)運(yùn)行多個(gè)軟件
    b.線程:能夠完成多任務(wù)玩荠;比如一個(gè)瀏覽器可以開(kāi)多個(gè)窗口
  • 定義的不同
    a.進(jìn)程:是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位
    b.線程:線程是進(jìn)程的一個(gè)實(shí)體漆腌,是CPU進(jìn)行調(diào)度和分派的基本單位。它是比進(jìn)程更小的能獨(dú)立運(yùn)行的單位阶冈。線程自己基本上不擁有系統(tǒng)資源闷尿,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(比如程序計(jì)數(shù)器,一組寄存器和棧)女坑,但是它可以和同屬一個(gè)進(jìn)程之間的其它線程共享該進(jìn)程所擁有的全部資源
  • 區(qū)別
    a.一個(gè)程序至少有一個(gè)進(jìn)程填具,一個(gè)進(jìn)程至少有一個(gè)線程
    b.線程的劃分尺度小于進(jìn)程(資源比進(jìn)程少),使得多線程程序的并發(fā)性高
    c.進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存空間匆骗,而該進(jìn)程的多個(gè)線程可以共享這個(gè)內(nèi)存空間劳景,從而極大提高了程序的運(yùn)行效率
    d.不同進(jìn)程之間的內(nèi)存空間是獨(dú)立的
    e.線程不能夠獨(dú)立運(yùn)行,必須依賴于進(jìn)程
  • 優(yōu)缺點(diǎn)
    a.線程的執(zhí)行開(kāi)銷小碉就,但是不利于資源的管理和保護(hù)(線程之間資源共享)
    b.進(jìn)程的執(zhí)行開(kāi)銷大盟广,但是有利于資源的管理和保護(hù)(進(jìn)程之間資源不共享)
4、multiprocessing
  • 官方說(shuō)明
    multiprocessing 是一個(gè)用與threading模塊相似API的支持產(chǎn)生進(jìn)程的包. multiprocessing包同時(shí)提供本地和遠(yuǎn)程并發(fā)瓮钥,使用子進(jìn)程代替線程筋量,有效避免Global Interpreter Lock帶來(lái)的影響烹吵。因此,multiprocessing模塊允許程序員充分利用機(jī)器上的多個(gè)核心毛甲。Unix 和 Windows 上都可以運(yùn)行旷偿。
  • Process類
    通過(guò)創(chuàng)建一個(gè)Process對(duì)象然后調(diào)用它的start()方法來(lái)生成進(jìn)程邻梆。 Processthreading.Thread 的API相同揍移。
  1. Process(group, target, name, args, kwargs)
    group:指定進(jìn)程組滑肉,大部分情況使用不到
    target:如果傳遞了函數(shù)的引用,這個(gè)子進(jìn)程就會(huì)執(zhí)行這個(gè)函數(shù)
    name:給子進(jìn)程設(shè)置名字七咧,可不設(shè)置
    args:給target指定的函數(shù)傳遞參數(shù)跃惫,tuple
    kwargs:給target指定的函數(shù)傳遞參數(shù),dict
  2. Process創(chuàng)建的實(shí)例對(duì)象的常用方法:
    start():?jiǎn)?dòng)子進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程)
    is_alive():判斷進(jìn)程的子進(jìn)程是否還存活
    join(timeout):是否等待子進(jìn)程執(zhí)行結(jié)束艾栋,或者等待指定的秒數(shù)爆存,然后再進(jìn)行下面的代碼
    terminate():不管任務(wù)是否完成,立刻終止子進(jìn)程
    3.Process創(chuàng)建的實(shí)例對(duì)象的常用屬性:
    name:當(dāng)前進(jìn)程的別名蝗砾,默認(rèn)為Process-N先较,N是從1開(kāi)始遞增的整數(shù)
    pid:當(dāng)前進(jìn)程的pid(進(jìn)程號(hào)),可以用os.getpid()查看
5悼粮、代碼例子
  • 1闲勺、使用進(jìn)程執(zhí)行簡(jiǎn)單任務(wù)
import time
from multiprocessing import Process


def work1():
    print('喝水5秒')
    for i in range(5):
        time.sleep(1)
        print('喝水中...')


def work2():
    print('澆花4秒')
    for i in range(4):
        time.sleep(1)
        print('澆花中...')


""" 使用多進(jìn)程來(lái)執(zhí)行多任務(wù)"""

if __name__ == '__main__':  # Process在windows系統(tǒng)運(yùn)行必須在__main__中,mac則不需要
    p1 = Process(target=work1)
    p2 = Process(target=work2)
    p1.start()
    p2.start() 
  • 2扣猫、Process執(zhí)行的注意事項(xiàng)
    Process在windows系統(tǒng)運(yùn)行必須在__main__塊中菜循,mac則不需要
    去掉__main__直接運(yùn)行

    加入__main__進(jìn)行運(yùn)行

  • 3、創(chuàng)建帶參的進(jìn)程類
    方式和Thread一樣申尤,重寫__init__run方法
from multiprocessing import Process


class MyPrecess(Process):

    def __init__(self, value):
        self.value = value
        super().__init__()

    def run(self):
        for i in range(10):
            print(F'進(jìn)程{self.name}的{self.value}在跑第{i}次')  # 獲取進(jìn)程名


if __name__ == '__main__':
     p = []
     p1 = MyPrecess(value='lzl')
     p2 = MyPrecess(value='lzl')
     p.append(p1)
     p.append(p2)
     p1.start()
     p[0].terminate()  # 終止p1
     p2.start() 
  • 4癌幕、多進(jìn)程操作全局變量
    1.進(jìn)程各自擁有自己的變量,不會(huì)對(duì)全局變量有影響昧穿。比如1個(gè)主進(jìn)程中有2個(gè)子進(jìn)程勺远,那么這三個(gè)進(jìn)程都擁有自己的“全局變量”
    2.下面例子中,number會(huì)有三個(gè)值:0时鸵、500000谚中、1000000
from multiprocessing import Process

number = 0


def work1():
    for i in range(0, 1000000):
        global number
        number += 1
    print(number)


def work2():
    for i in range(0, 500000):
        global number
        number += 1
    print(number)


if __name__ == '__main__':
    p1 = Process(target=work1)
    p2 = Process(target=work2)
    p1.start()
    p2.start()
    print(number)
    '''
    三個(gè)值:
    0
    500000
    1000000
    ''' 
  • 5、多進(jìn)程操作系統(tǒng)資源
    1.文件是系統(tǒng)資源寥枝,進(jìn)程之間會(huì)共用,并會(huì)有資源競(jìng)爭(zhēng)
    2.下面的例子中磁奖,跑出來(lái)的結(jié)果中囊拜。文件中的內(nèi)容并不是1000行java、1000行python
from multiprocessing import Process


def work1():
    for i in range(0, 1000):
        with open(r"D:\python\test_09\test\test.txt", 'a') as f:
            f.write('python\n')


def work2():
    for i in range(0, 1000):
        with open(r"D:\python\test_09\test\test.txt", 'a') as f:
            f.write('java\n')


if __name__ == '__main__':
    p1 = Process(target=work1)
    p2 = Process(target=work2)
    p1.start()
    p2.start()
    p1.join()
    p2.join() 

3.出現(xiàn)這個(gè)bug的原因比搭,類似線程對(duì)共享資源的競(jìng)爭(zhēng)冠跷,進(jìn)程函數(shù)還在運(yùn)行時(shí),系統(tǒng)切換了進(jìn)程資源,導(dǎo)致上一個(gè)進(jìn)程的內(nèi)容還沒(méi)完全寫入到文件中蜜托。

上面例子的結(jié)果:
不加鎖的結(jié)果

  • 6抄囚、解決進(jìn)程之間對(duì)系統(tǒng)資源的競(jìng)爭(zhēng)關(guān)系
    1.使用鎖,對(duì)進(jìn)程進(jìn)行串行處理橄务。同一時(shí)刻只能有一個(gè)進(jìn)程在執(zhí)行
    2.因?yàn)槭沁M(jìn)程幔托,所以鎖對(duì)象只能通過(guò)參數(shù)來(lái)傳遞給進(jìn)程所調(diào)用的函數(shù)或類
    3.使用鎖來(lái)解決上面例子的bug
from multiprocessing import Process
from multiprocessing import Lock


def work1(lock):
    # 操作之前加鎖
    lock.acquire()
    for i in range(0, 1000):
        with open(r"D:\python\test_09\test\test.txt", 'a') as f:
            f.write('python\n')
    # 操作結(jié)束后釋放鎖
    lock.release()


def work2(lock):
    lock.acquire()
    for i in range(0, 1000):
        with open(r"D:\python\test_09\test\test.txt", 'a') as f:
            f.write('java\n')
    lock.release()


if __name__ == '__main__':
    lock = Lock()
    p1 = Process(target=work1, args=(lock,))
    p2 = Process(target=work2, args=(lock,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

結(jié)果:
加了鎖的結(jié)果
6、進(jìn)程之間的通信
  • 1蜂挪、進(jìn)程之間的通信使用的也是隊(duì)列重挑,不過(guò)并不是線程所使用的隊(duì)列
    queue.Queue:進(jìn)程內(nèi)的線程之間的隊(duì)列
    multiprocess.Queue:進(jìn)程之間的隊(duì)列

  • 2、multiprocess.Queue
    可以使用multiprocess.Queue來(lái)實(shí)現(xiàn)多進(jìn)程之間的數(shù)據(jù)的傳遞棠涮,Queue本身是一個(gè)消息隊(duì)列程序谬哀。
    注意:multiprocess.Queue需要把它的實(shí)例對(duì)象,以參數(shù)的形式傳入到各個(gè)進(jìn)程任務(wù)中(不會(huì)被復(fù)制到進(jìn)程的內(nèi)存中严肪,只是傳遞過(guò)去)史煎,否則各個(gè)進(jìn)程使用的還是各自的隊(duì)列(也就是把隊(duì)列復(fù)制到各自的內(nèi)存里了),無(wú)法形成進(jìn)程之間的數(shù)據(jù)傳遞

from multiprocessing import Process
from multiprocessing import Queue
import os

q = Queue()  # 創(chuàng)建隊(duì)列
# 給隊(duì)列添加數(shù)據(jù)
for i in range(5):
    q.put(i)

"""如果不使用傳參的方式驳糯,那么兩個(gè)進(jìn)程之間使用的隊(duì)列是各自的隊(duì)列篇梭,不能完成通信"""


def work1(q):  # 使用同一個(gè)隊(duì)列資源
    while not q.empty():
        print(F"進(jìn)程{os.getpid()}在獲取隊(duì)列中的數(shù)據(jù){q.get()}")


def work2(q):  # 使用同一個(gè)隊(duì)列資源
    while not q.empty():
        print(F"進(jìn)程{os.getpid()}在獲取隊(duì)列中的數(shù)據(jù){q.get()}")


if __name__ == '__main__':
    p1 = Process(target=work1, args=(q,))
    p2 = Process(target=work2, args=(q,))
    p1.start()
    p2.start()
'''
結(jié)果:兩個(gè)進(jìn)程使用的是同個(gè)隊(duì)列的資源,實(shí)現(xiàn)了進(jìn)程之間的通信

進(jìn)程8380在獲取隊(duì)列中的數(shù)據(jù)0
進(jìn)程8380在獲取隊(duì)列中的數(shù)據(jù)1
進(jìn)程8380在獲取隊(duì)列中的數(shù)據(jù)2
進(jìn)程8380在獲取隊(duì)列中的數(shù)據(jù)3
進(jìn)程8380在獲取隊(duì)列中的數(shù)據(jù)4
'''
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末结窘,一起剝皮案震驚了整個(gè)濱河市很洋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧枫,老刑警劉巖喉磁,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異官脓,居然都是意外死亡协怒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門卑笨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)孕暇,“玉大人,你說(shuō)我怎么就攤上這事赤兴⊙希” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵桶良,是天一觀的道長(zhǎng)座舍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)陨帆,這世上最難降的妖魔是什么曲秉? 我笑而不...
    開(kāi)封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任采蚀,我火速辦了婚禮,結(jié)果婚禮上承二,老公的妹妹穿的比我還像新娘榆鼠。我一直安慰自己,他們只是感情好亥鸠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布妆够。 她就那樣靜靜地躺著,像睡著了一般读虏。 火紅的嫁衣襯著肌膚如雪责静。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天盖桥,我揣著相機(jī)與錄音灾螃,去河邊找鬼。 笑死揩徊,一個(gè)胖子當(dāng)著我的面吹牛腰鬼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塑荒,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼熄赡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了齿税?” 一聲冷哼從身側(cè)響起彼硫,我...
    開(kāi)封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凌箕,沒(méi)想到半個(gè)月后拧篮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牵舱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年串绩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芜壁。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡礁凡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慧妄,到底是詐尸還是另有隱情顷牌,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布塞淹,位于F島的核電站韧掩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窖铡。R本人自食惡果不足惜疗锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费彼。 院中可真熱鬧滑臊,春花似錦、人聲如沸箍铲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颠猴。三九已至关划,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翘瓮,已是汗流浹背贮折。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留资盅,地道東北人调榄。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呵扛,于是被迫代替她去往敵國(guó)和親每庆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 5,971評(píng)論 3 28
  • 進(jìn)程今穿、進(jìn)程的使用缤灵、進(jìn)程注意點(diǎn)、進(jìn)程間通信-Queue蓝晒、進(jìn)程池Pool腮出、進(jìn)程與線程對(duì)比、文件夾拷貝器-多任務(wù) 1.進(jìn)...
    Cestine閱讀 812評(píng)論 0 0
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口拔创,提供良好的抽象接口利诺。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,541評(píng)論 0 5
  • 進(jìn)程 操作系統(tǒng)背景知識(shí) 顧名思義,進(jìn)程即正在執(zhí)行的一個(gè)過(guò)程灭红。進(jìn)程是對(duì)正在運(yùn)行程序的一個(gè)抽象侣滩。 進(jìn)程的概念起源于操作...
    go以恒閱讀 950評(píng)論 0 2
  • 賬號(hào)申請(qǐng) 要開(kāi)發(fā)iOS App,首先要有賬號(hào)变擒,賬號(hào)分三種: 個(gè)人版 App Store 版 企業(yè)版 上面三種是通俗...
    勇往直前888閱讀 1,313評(píng)論 0 1