1. 程式人生 > >Python進程與線程

Python進程與線程

執行過程 讀寫 過多 CQ ppi 堆棧 lock 時間模塊 進程與線程

進程與線程:
*進程: 進程是系統中程序執行和資源分配的基本單元, 每個進程都有自己的數據段(存儲數據)、代碼段(存儲代碼)、堆棧段(對象和變量). # 全局變量等資源在多個進程中不能 共享, 在子進程中修改全局變量對父進程中的全局變量沒有影響.
*線程: 在一個進程內要同時幹多件事, 就得同時運行多個"子任務", 這些子任務稱為線程; 每個線程共享這個進程的所有資源(變量和數據等)和內存空間, 所以在子線程裏面可以修改該 進程的變量.
*多任務: 操作系統可以同時運行多個任務, 每個任務就是一個進程或者一個線程.
*並發: 並發是指一個處理器同時處理多個任務; 由於cpu調度執行的速度太快了, 所以看起來是同時執行, 實際上是輪流交替執行的.
*並行: 並行是指多個處理器同時處理多個任務.
*單核cpu實現多任務的原理: 操作系統輪流讓各個任務交替執行, 由於cpu調度執行的速度太快了, 導致我們感覺就像所有的任務都在同時執行一樣.
*多核cpu實現多任務的原理: 由於實際任務數量是遠遠多於cpu的核心數量的, 所以操作系統會自動把很多任務輪流調度到每個核心上執行.
*實現多任務的方式: 1. 多進程模式(用的較多): 一個父進程, n個子進程, 進程由操作系統來調度執行沒有順序; 要想讓所有子進程結束後再讓父進程結束, 可在子進程末尾使用 .join()方 法.
2. 多線程模式(用的最多): 一個父線程, n個子線程, 線程由操作系統來調度執行沒有順序, 要想線程順序執行, 需要加鎖(Lock); 要想所有子線程結束後再讓父線程 結束, 可在子線程末尾使用 .join()方法.
3. 協程模式(用的很少): 協程看上去也是子程序, 但執行過程中, 在子程序的內部可中斷, 然後轉而執行別的子程序, 不是函數調用.
4. 多進程+多線程(一般不建議使用)
*多進程模塊: multiprocessing, 它裏面的Process類是用來創建一個進程實例的, Pool線程池類是用來創建多個進程實例的.
*線程模塊: threading, 它裏面的Thread類是用來創建一個線程實例的, Lock類是用來創建一個鎖實例的.
*計算機IO操作: IO指的是計算機執行讀寫操作, 由於計算機執行讀寫操作的速度比cpu和內存的速度慢的多得多, 所以C語言這種底層計算機語言雖然cpu的速度比python快很多, 但是 有時候還是得等待計算機執行IO操作, 所以python在某些領域才有競爭力.

多進程:

# 從多進程模塊(multiprocessing)導入Process類
from multiprocessing import Process
import time
import os

# 定義子進程
def run(str):
    while True:
        # os.getpid()獲取進程id, os.getppid()獲取父進程id
        print("process %s"%str,os.getpid(),os.getppid())
        # 延時2秒
        time.sleep(2)


if __name__ == 
__main__: print("父進程啟動",os.getpid()) # 創建子進程, 用Process類創建一個pro對象 pro = Process(target=run,args=("1",)) # 啟動子進程 pro.start() while True: print("process 2") time.sleep(2.5)

線程鎖:

# 線程鎖的應用, 讓線程順序執行.
import time     # 導入時間模塊
import threading    # 導入threading線程模塊
num = 10 # 設置一個全局變量 lock = threading.Lock() # 創建一個鎖實例 def reduce_num(): # 定一個子線程函數reduce_num print("子線程開始...") global num # 聲明全局變量 lock.acquire() # 獲得一個鎖對象 temp = num # 讀取全局變量num num = temp - 1 # 把從全局拿來的變量進行減一的操作 lock.release() # 釋放掉鎖 print("子線程結束...\n") time.sleep(1) # 增加一個休眠功能 if __name__ == __main__: print("父線程啟動") for i in range(10): # 從0到10進行循環 t = threading.Thread(target=reduce_num) # 在循環中創建子線程,共創建10個 t.start() # 循環啟動子線程 t.join() # 讓子線程結束後, 再讓父線程結束 print("Result:%s"%num) # 打印通經過多次子線程函數更改過的全局變量, 結果為0則實驗成功. print("父線程結束")

結果: Result : 0

Python進程與線程