一、什麼是程式
- 程式:例如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()