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")
啟動該腳本輸出如下:
主程序執行結束的時候,線程依然會每兩秒打印一次信息,證實了線程是在父進程下執行的一個子任務。
注意:此例子為測試用例,不可在大型程序中留下任何線程在后台默默運行。