Python-進程
一、什麼是進程
- 程式:例如xxx.py這是程式,是一個靜態的
- 進程:一個程式運行起來後,程式碼+用到的資源稱之為進程,它是作業系統分配資源的基本單元。
- 不僅可以通過執行緒完成多任務,進程也是可以的
進程的狀態
- 工作中,任務數往往大於cpu的核數,即一定有一些任務正在執行,而另外一些任務在等待cpu進行執行,因此導致了有了不同的狀態
- 就緒狀態:運行的條件都已經滿足了,正在等待CPU執行
- 執行狀態:CPU正在執行器功能
- 等待狀態:等待某些條件滿足,例如一個程式sleep了,此時就處於等待狀態
二、進程和執行緒對比
功能
- 進程,能夠完成多任務,比如:在一台電腦上能夠同時運行多個軟體
- 執行緒,能夠完成多任務,比如:一個QQ中的多個聊天窗口
定義的不同
- 進程是系統進行資源分配和調度的一個獨立單位
- 執行緒是進程的一個實體,是cpu調度和分派的基本單位,他說比進程更小的能獨立運行的基本單位,執行緒自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程式計數器,一組暫存器和棧)但是它可與同屬一個進程的其他的執行緒共享進程所擁有的全部資源。
區別:
- 一個程式至少有一個進程,一個進程至少有一個執行緒
- 執行緒的劃分尺度小於進程(資源比進程少)使得多執行緒程式的並發性高
- 進程在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大提高了程式的運行效率
- 執行緒不能夠獨立執行,必須依存在進程中
- 可以將進程理解為工廠中的一條流水線,而其中的執行緒就是這個流水線上的工人
優缺點:
- 執行緒和進程在使用上各有優缺點:執行緒執行開銷小,但不利於資源的管理和保護;而進程正相反。
multiprocessing模組
- Process創建的實例對象的常用方法:
- start : 啟動子進程實例(創建子進程)
- is_alive:判斷進程子進程是否還在執行
- join([timeout]) :是否等待子進程執行結束,或等待多少秒
- terminate():不管任務是否完成,立即終止子進程
- Process創建的實例對象的常用屬性:
- name:當前進程的別名,默認我Process-N,N從1開始遞增的整數
- pid:當前進程的pid(進程號)
1 import time 2 from multiprocessing import Process 3 4 5 # 多進程執行多任務 6 # 多進程不共享全局變數 7 def work1(): 8 for i in range(5): 9 print("這個是任務1------") 10 time.sleep(0.5) 11 12 13 def work2(): 14 for i in range(5): 15 print("這個是任務2------") 16 time.sleep(0.5) 17 18 19 if __name__ == '__main__': 20 # windows系統py創建進程不加__main__會進入無限遞歸狀態 21 p1 = Process(target=work1) 22 p2 = Process(target=work2) 23 24 p1.start() 25 p2.start()
三、多進程間相互通訊Queue
- python 進程隊列multiprocessing.Queue()和執行緒隊列queue.Queue區別
① queue.Queue是執行緒內非阻塞隊列
② multiprocessing.Queue是跨進程通訊隊列
③ 多進程前者是各自私有,後者是各子進程共有
④ Process之間有時需要通訊,作業系統提供了很多機制來實現進程間的通訊
- 多進程中Queue的使用
1、可以使用multiprocessing模組的Queue實現多進程之間的數據傳遞,Queue本身是一個消息隊列程式
2、注意:進程之間的Queue要當做參數傳進去(不共享全局變數)
1 # 多進程間相互通訊 2 from multiprocessing import Process, Queue 3 count = 1 4 def work1(q): 5 while q.qsize() > 0: 6 global count 7 q.get() 8 print("這個是任務1------") 9 print("執行%s 次" % count) 10 count += 1 11 12 def work2(q): 13 while q.qsize() > 0: 14 global count 15 q.get() 16 print("這個是任務2------") 17 print("執行%s 次" % count) 18 count += 1 19 20 if __name__ == '__main__': 21 q = Queue() 22 for i in range(10): 23 q.put("hello") 24 p1 = Process(target=work1, args=(q,)) 25 p2 = Process(target=work2, args=(q,)) 26 27 p1.start() 28 p2.start()