Python並行程式設計(一):基本概念
1、執行緒和程序
程序是應用程式的一個執行例項,比如,在桌面上雙擊瀏覽器將會執行一個瀏覽器。執行緒是一個控制流程,可以在程序內與其他活躍的執行緒同時執行。控制流程指的是順序執行一些機器指令。程序可以包含多個執行緒,所以開啟一個瀏覽器,作業系統將建立一個程序,並開始執行這個程序的主執行緒。每一個執行緒將獨立執行一系列的指令,通常是一個函式,並且和其他執行緒並行執行。然而,同一個程序內的執行緒可以共享一些地址空間和資料結構。執行緒也被稱作輕量程序,因為它和程序有許多共同點,比如都是可以和其他控制流程同時執行的控制流程,不同於程序的是多個執行緒可以共享很多資源,特別是地址空間和資料結構等。
- 程序可以包含多個並行執行的執行緒
- 作業系統建立和管理執行緒比程序更節省CPU資源。執行緒用於一些小任務,程序用於繁重的任務:執行應用程式
- 同一個程序下的執行緒共享地址空間和其他資源,程序之間相互獨立
2、在Python中使用程序
建立called_Process.py
print("Hello Python Parallel!!") closeInput = input("Press ENTER to exit") print("Closing calledProcess")
建立calling_Process.py
import os import sys ## this is the code to execute program = "python" print("Process calling") arguments = ["called_Process.py"] ## we call the called_Process.py script os.execvp(program, (program,) + tuple(arguments)) print("Good Bye!!")
此時執行calling_Process會通過execvp開啟一個新的程序,替換當前的程序,所以Good Bye不會被列印。
執行結果如下:
再次敲擊回車
程式結束
3、在Python中使用執行緒
基於執行緒的並行是編寫並行程式的標準方法。然而Python直譯器並不完全是執行緒安全的,為了支援多執行緒的Python程式,CPython使用全域性直譯器鎖的技術,但是這意味著同一時間只有一個執行緒可以執行Python程式碼;執行某一個執行緒一小段時間之後,Python會自動切換到下一個執行緒。GIL並沒有完全解決執行緒安全的問題,如果多個執行緒檢視使用共享資料,還是可能導致未確定的行為。
執行緒例子:
from threading import Thread from time import sleep class CookBook(Thread): def __init__(self): Thread.__init__() self.message = "Hello Parallel Python CookBook!!\n" def print_message(self): print(self.message) def run(self): print("Thread Starting\n") x = 0 while (x < 10): self.print_message() sleep(2) x += 1 print("Thread Ended\n") # start the main process print("Process Started") # create a instance hello_python = CookBook() # start hello_python by run hello_python.start() print("Process Ended")
啟動該指令碼輸出如下:
主程式執行結束的時候,執行緒依然會每兩秒列印一次資訊,證實了執行緒是在父程序下執行的一個子任務。
注意:此例子為測試用例,不可在大型程式中留下任何執行緒在後臺默默執行。