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

      啟動該腳本輸出如下:

      

      主程序執行結束的時候,線程依然會每兩秒打印一次信息,證實了線程是在父進程下執行的一個子任務。

      注意:此例子為測試用例,不可在大型程序中留下任何線程在后台默默運行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM