欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的線程之線程同步

 更新時間:2021年12月15日 14:48:29   作者:雷學(xué)委  
這篇文章主要為大家介紹了Python線程同步,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

在多線程程序中,它們互相獨(dú)立打印的時間卻是錯亂的!

如下圖,明明t-0 > t-1 > t-2 (按照線程創(chuàng)建時間早晚排列)。最后輸出居然是t-1最落后。

我們怎么樣做避免錯亂呢, 下面看看。

線程同步

多線程,就是多個獨(dú)立的運(yùn)行單位,同時執(zhí)行同樣的事情。

多線程不是已經(jīng)做到同時執(zhí)行了嗎?還需要同步干嘛?

是的,線程是同時被調(diào)用執(zhí)行了,但是每個線程之間互相獨(dú)立,也互相競爭了。

這就跟跑道上有3個運(yùn)動員,槍響之后同時開跑,但是他們通常卻不是同時到達(dá)終點(diǎn)。

同步是什么意思?

同步就是原本這條跑道跑三個人的加上同步之后,在任意時間上,只有一個人在跑道。

聽起來是不是匪夷所思,怎么多線程不是為多個任務(wù)提高效率嗎?加個同步不就一個時間只有一個任務(wù)執(zhí)行了,這還扯啥多線程。

很遺憾,同步就是這個意思,我們有時會說完整一點(diǎn),同步互斥!總結(jié)來說就是:同步是一種機(jī)制,它保證跑道上面任何時候只有一個運(yùn)動員。技術(shù)上來說就是,同步保證 程序數(shù)據(jù) 任何時候只被一個線程操作。

我們使用同步機(jī)制的時候,也是在找那些應(yīng)該被限制的'跑道‘,利用同步機(jī)制保證在那個跑道上任意時刻只有一個‘運(yùn)動員'在上面跑步。

(解釋的很清楚了,看不懂的可以找同學(xué)討論上面的這幾句)

我們了解了同步機(jī)制,下面看看鎖。

threading.Lock獲取同步鎖

threading.Lock是一個類,我們能用它創(chuàng)建一個鎖對象。

什么是鎖?
維持同步互斥機(jī)制的媒介
相當(dāng)于跑道有個大門,每次只開門讓一個程序員進(jìn)去跑
說錯了,運(yùn)動員(程序員還是需要多鍛煉?。?。

鎖要是壞了,后果可以自己想象(后面文章會說)。

我們下面代碼會用到Lock的兩個函數(shù):

acquire函數(shù):獲取鎖

release函數(shù):釋放鎖

前文說過了,加上主線程,一共是4個線程。

運(yùn)行下面代碼看看:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/21 12:02 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學(xué)委
# @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 + " 關(guān)注雷學(xué)委,學(xué)會了開發(fā)知識!"
    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)

下面是運(yùn)行結(jié)果:

我們看到每個線程都完整完成了任務(wù),不會出現(xiàn)三個線程互相穿插錯亂的輸出。

這里初學(xué)者可以感受一下同步的作用,效果。

總結(jié)

以上就是一種線程協(xié)調(diào)方案。

線程同步,也并非同一步調(diào),而是同步互斥!

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評論