Python的線程之線程同步
在多線程程序中,它們互相獨立打印的時間卻是錯亂的!
如下圖,明明t-0 > t-1 > t-2 (按照線程創建時間早晚排列)。最後輸出居然是t-1最落後。
我們怎麼樣做避免錯亂呢, 下面看看。
線程同步
多線程,就是多個獨立的運行單位,同時執行同樣的事情。
多線程不是已經做到同時執行瞭嗎?還需要同步幹嘛?
是的,線程是同時被調用執行瞭,但是每個線程之間互相獨立,也互相競爭瞭。
這就跟跑道上有3個運動員,槍響之後同時開跑,但是他們通常卻不是同時到達終點。
同步是什麼意思?
同步就是原本這條跑道跑三個人的加上同步之後,在任意時間上,隻有一個人在跑道。
聽起來是不是匪夷所思,怎麼多線程不是為多個任務提高效率嗎?加個同步不就一個時間隻有一個任務執行瞭,這還扯啥多線程。
很遺憾,同步就是這個意思,我們有時會說完整一點,同步互斥!總結來說就是:同步是一種機制,它保證跑道上面任何時候隻有一個運動員。技術上來說就是,同步保證 程序數據 任何時候隻被一個線程操作。
我們使用同步機制的時候,也是在找那些應該被限制的’跑道‘,利用同步機制保證在那個跑道上任意時刻隻有一個‘運動員’在上面跑步。
(解釋的很清楚瞭,看不懂的可以找同學討論上面的這幾句)
我們瞭解瞭同步機制,下面看看鎖。
threading.Lock獲取同步鎖
threading.Lock
是一個類,我們能用它創建一個鎖對象。
什麼是鎖?
維持同步互斥機制的媒介
相當於跑道有個大門,每次隻開門讓一個程序員進去跑
說錯瞭,運動員(程序員還是需要多鍛煉啊)。
鎖要是壞瞭,後果可以自己想象(後面文章會說)。
我們下面代碼會用到Lock的兩個函數:
acquire函數:獲取鎖
release函數:釋放鎖
前文說過瞭,加上主線程,一共是4個線程。
運行下面代碼看看:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/11/21 12:02 上午 # @Author : LeiXueWei # @CSDN/Juejin/Wechat: 雷學委 # @XueWeiTag: CodingDemo # @File : __init__.py.py # @Project : hello import threading import datetime import time def dianzan_guanzhu(lock: threading.Lock): thread_name = threading.current_thread().getName() print("線程啟動瞭:", thread_name) now = datetime.datetime.now() name = "python萌新" + thread_name lock.acquire() print("%s - %s name:%s" % (thread_name, now, name)) time.sleep(1) result = "好棒!" + name + " 關註雷學委,學會瞭開發知識!" print("%s - %s result:%s" % (thread_name, now, result)) lock.release() return result my_lock = threading.Lock() for i in range(3): mythread = threading.Thread(name="t-" + str(i), target=lambda: dianzan_guanzhu(my_lock)) print("mythread:", mythread) print("is_alive:", mythread.is_alive()) mythread.start() ac = threading.active_count() print("active_count:", ac)
下面是運行結果:
我們看到每個線程都完整完成瞭任務,不會出現三個線程互相穿插錯亂的輸出。
這裡初學者可以感受一下同步的作用,效果。
總結
以上就是一種線程協調方案。
線程同步,也並非同一步調,而是同步互斥!
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!