進程,多進程,進程與程序的區別,程序運行的三種狀態,multiprocessing模塊中的Process功能,和join函數,和其餘屬性,殭屍與孤兒進程

1.進程

什麼是進程:python

  一個正在被運行的程序就稱之爲進程,是程序具體執行的過程,是一種抽象概念,進程來自操做系統linux

2.多進程程序員

 多個正在運行的程序windows

在python中實現多線程的方法瀏覽器

from multiprocessing import Process
import os
import time


# 當出現一些耗時時間比較長的操做時,會致使程序進入阻塞狀態,沒法執行其餘代碼
# 這個時候就能夠開啓子進程把任務交給他


def task(name):
    print('name%s子進程開始!'% name)
    print('name%s子進程結束!'% name)

if __name__ == '__main__':
    p = Process(target=task,args=('大哥',))

    # 開啓子進程,本質是向操做系統發送請求,讓它啓動進程,一般不可能當即開啓
    p.start()
    p.join()
    print('父進程結束')

'''
PS:windows 和 linux 開啓進程的方式不一樣
相同之處:都是須要將數據copy一份給子進程,這樣  子進程才知道要幹什麼
linux 會將父進程的全部數據 徹底copy,而後拿到父進程,知道代碼的位置,繼續執行
windows 會copy 一部分數據  同時會導入py文件來執行,這樣一來就會遞歸開啓進程
因此windows中開啓子進程都須要開啓判斷

不過都建議加上判斷,能夠保證兩個平臺均可以使用

記住:
開啓進程的代碼,都把它放到 if __name__ == '__main__': 中便可
'''

 

自定義開啓子進程:多線程

 

3.進程與程序的區別

程序就是一堆計算機能夠識別文件,程序在沒有被運行就是躺在硬盤上的一堆二進制併發

運行程序時,要從硬盤讀取數據到內存中,CPU從內存讀取指令並執行 ,函數

一旦運行就產生了進程 優化

一個程序能夠屢次執行 產生多個進程,可是進程之間相互獨立spa

當咱們右鍵運行了一個py文件時 ,其實啓動的是python解釋器,你的py文件實際上是看成參數傳給瞭解釋器

4.程序運行的三種狀態

1. 阻塞與非阻塞

  阻塞:當程序遇到IO操做(輸入輸出)時,就進入了阻塞狀態

  非阻塞:程序正常運行種,沒有遇到任何IO操做,就處於非阻塞狀態

阻塞與非阻塞說的是程序運行狀態

2.併發

  同一時間段,有多個程序都處於運行狀態,但一個時間點只有一個程序被CUP處理,本質上切換執行,切換的同時,保存上一個任務的操做

3.並行

  同一時間段,多個任務同時被CUP處理

併發與並行說的是任務的處理方式

    PS:關於程序員永恆的話題  

      提升效率

 

      根本方法就是讓程序儘量處於運行狀態

 

      減小IO 儘量多佔用CPU時間

 

      緩衝區就是用於減小IO操做的

 

5.multiprocessing模塊的使用(Process經常使用方法,join函數,)

#  Process其餘使用方法

from multiprocessing import Process
def task():
    print('121212')
    exit(100)  # 退出碼

if __name__ == '__main__':
    p = Process(target=task,name='李果')
    p.start()       # 此處名爲懶加載優化機制,若是沒有調用start ,那麼該對象將不會被建立
    p.join()        # 等待子進程結束
    p.terminate()   # 終止進程
    print(p.is_alive())  # 判斷進程是否存活
    print(p.pid)         # 查看PID
    print(p.exitcode)    # 獲取退出碼
import time
from multiprocessing import Process

def stak(i):
    print('買菸去了')
    time.sleep(i)
    print('%s 買完了!'% i)

if __name__ == '__main__':
    strat_time = time.time()
    p1 = Process(target=stak,args=(1,))
    p2 = Process(target=stak,args=(2,))
    p3 = Process(target=stak,args=(3,))

    # strat() 是同時進行的
    p1.start()
    p2.start()
    p3.start()

    # join等待的順序是根據子進程工做結束的順序來定的
    p1.join()
    p2.join()
    p3.join()


    end_time = time.time()
    print(end_time - strat_time)
    print('over')

 

 

6.殭屍與孤兒進程

孤兒進程:

指的是,父進程先結束 ,而子進程還在運行着,

孤兒進程無害,有 其存在的必要性

例如:qq開啓了瀏覽器,qq先退出了 瀏覽器應該繼續運行

孤兒進程會被操做系統接管

殭屍進程:

 

值得是,子進程已經結束了,可是操做系統會保存一些進程信息,如PID,運行時間等,此時這個進程就稱之爲殭屍進程

 

殭屍進程若是太多將會佔用大量的資源,形成系統沒法開啓新新進程

 

linux 中有一個wai/waitpid 用於父進程回收子進程資源

 

python會自動回收殭屍進程

相關文章
相關標籤/搜索