1. 程式人生 > >Python多執行緒例項

Python多執行緒例項

相關文件

Python多執行緒的實現和原理

執行緒與程序

執行緒是程序內一個執行單元,也是程序內的可排程實體。

執行緒與程序的區別:

  1. 地址空間,程序獨立空間,執行緒共享程序內的地址空間
  2. 資源分配,程序是系統資源排程及分派的基本單位
  3. 執行緒是處理器排程的基本單位
  4. 二者均可實現併發

多執行緒:
執行緒的劃分小,並行的效率高;
多執行緒共享記憶體單元,極大地提高了程式執行效率

Python執行緒模組

Python3支援執行緒的模組主要有thread和threading兩個模組,thread是比較底層的模組,threading是對thread的一個封裝的模組,threading比較方便以及好用。

Python3.x通過Threading模組建立新的執行緒有兩種方法:

  1. 通過threading.Thread(target=executable Method),即通過傳遞給Thread物件一個可執行方法或物件;
  2. 繼承threading.Thread定義子類並重寫run()方法。

第2種方法中,唯一必須重寫的方法是run()

(1) 通過threading.Thread() 進行建立多執行緒,即通過傳遞給thread物件一個可執行的方法(或物件)

import threading
import time

def target():
    print
(threading.current_thread().name, "1") time.sleep(2) print(threading.current_thread().name, "2") # 當前主執行緒在執行 print(threading.current_thread().name, "3") # 開啟執行緒t, 一般按順序賦予:Thread-1 t = threading.Thread(target=target) t.start() # join()是阻塞當前執行緒,此處的當前執行緒是主執行緒, # 主執行緒直到Thread-1結束之後才結束, 所以最後結束的是主執行緒
t.join() print(threading.current_thread().name, "4")

執行結果:
MainThread 3
Thread-1 1
Thread-1 2
MainThread 4

(2) 通過繼承 threading.Thread 定義子類建立多執行緒
使用 threading 模組建立多執行緒,直接從 threading.Thread 繼承,然後重寫__init__() 方法和 run() 方法

import threading
import time

class MyThread(threading.Thread):   #繼承父類threading.Thread
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter

    def run(self):    #把要執行的程式碼寫到run函式裡面,執行緒在建立後會直接執行run
        print("開始執行:" + self.name)
        print(self.name, self.counter, 5)
        print("結束執行:" + self.name)


def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print("%s 程序 在:" % (threadName, time.ctime(time.time())))
        counter -= 1


#建立新執行緒
thread_1 = MyThread(1, "Thread-1", 1)
thread_2 = MyThread(2, "Thread-2", 2)

#開啟執行緒
thread_1.start()
thread_2.start()

#等待執行緒結束
thread_1.join()
thread_2.join()

執行結果:
開始執行:Thread-1
開始執行:Thread-2
Thread-1 1 5
Thread-2 2 5
結束執行:Thread-1
結束執行:Thread-2

這個結果有一定的變化。可以使用執行緒同步進行控制。

執行緒同步

​ 如果多個執行緒共同對某個資料修改,則可能出現不可預料的結果,為了保證資料的正確性,需要對多個執行緒進行同步。

​ 使用Thread物件的Lock和Rlock可以實現簡單的執行緒同步,這兩個物件都有acquire方法和release方法,對於那些需要每次只允許一個執行緒操作的資料,可以將其操作放到acquire和release方法之間。

​ 需要注意的是,Python有一個GIL(Global Interpreter Lock)機制,任何執行緒在執行之前必須獲取這個全域性鎖才能執行,每當執行完100條位元組碼,全域性鎖才會釋放,切換到其他執行緒執行。

多執行緒實現同步有四種方法:
1、鎖機制
2、訊號量
3、條件判斷
4、同步佇列

1、鎖機制實現示例
threading的Lock類,用該類的 acquire 函式進行加鎖,用 realease 函式進行解鎖


未完待續…