1. 程式人生 > >Python並行程式設計(一):基本概念

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")

      啟動該指令碼輸出如下:

      

      主程式執行結束的時候,執行緒依然會每兩秒列印一次資訊,證實了執行緒是在父程序下執行的一個子任務。

      注意:此例子為測試用例,不可在大型程式中留下任何執行緒在後臺默默執行。