Python 線程同步

Python 線程同步

  • Python 線程同步

Python 線程同步

線程同步是一種確保兩個或多個線程不同時執行同一塊共享代碼的機制。共享塊中的代碼通常是訪問共享數據或資源,這種共享塊被稱作臨界區。這個概念可以用下面的圖清晰地表示出來:

主線程
線程 1
線程 2
臨界區

多個線程在同一時間記問臨界區,就會有可能同時嘗試訪問或改變數據,這有可能會導致不可預知的后果。這種情況被稱作競態條件。

為了講解什么是競態條件,我們將實現一個包含兩個線程的簡單的程序,每個線程都會給一個共享變量增加值一百萬次。我們選擇一個較大的數,是為了確保發現競態條件。在速度比較低的 CPU 上,用一個小一點的數,也有可能發現競態條件。在這個程序中,我們使用同一個函數(inc)創建兩個線程。訪問共享變量并且每次給它加 1 的代碼在臨界區里,兩個線程訪問這個變量時,沒有做任何保護。下面是完整的例子:

from  threading import Thread, current_thread
from time import sleepdef inc():global xfor _ in range(1000000):x += 1# 全局變量
x  =  0# 創建線程
t1 = Thread(target=inc, name="線程 1")
t2 = Thread(target=inc, name="線程 2")# 啟動線程
t1.start()
t2.start()# 等待線程結束
t1.join()
t2.join()print("最后 x 的值是:", x)

在上面的這個程序中,我們期望 x 最后的值是 2000000,但是在程序的輸出結果里,我們可能看不到 2000000。每次執行這個程序,都有可能看到不一樣的結果,這個結果會比 2000000小一些。讓我們看一下代碼,線程 1線程 2 同時執行臨界區代碼 x += 1。兩個線程都會請求 x 的當前值。如果當前的值是 1000,兩個線程都會得到 1000,并且給它加上 1,得到 1001。接下來,這兩個線程都會把 1001 寫回到內存里去。這樣最終 x 的值就是 1001。然而,實際上,每個線程都給 x 增加了 1,現在 x應該是 1002才對。要改正這種錯誤,就要用到線程的同步機制。

線程的同步可以使用 Lock 類實現,這個類存在于 Thread 模塊中。這個鎖是用由操作統提供的信號量實現的。信號量是操作系統級別的同步對象,用來控制資源和數據在多處理器程多線程中的訪問。Lock類提供了兩個方法,acquirerelease,詳見如下描述:

  • acquire 方法用來獲取鎖。鎖可以是阻塞式的(默認)或非阻塞式的。如果是一個阻塞鎖,調用 acquire 的線程會被阻塞,直到另外的擁有鎖的線程調用 release 方法。一旦擁有鎖的線程調用了 release方法,就會有一個調用 acquire 的錢程獲得鎖。如果鎖是非阻塞式的,線程在調用 acquire 后不會被阻塞,如果鎖沒有鎖,那么線程就會擁有鎖;如果鎖已經被占有,那么 acquire 就會返回 False

  • release 方法用來釋放鎖,意味著把鎖重置為非鎖狀態。鎖被重置為非鎖狀態后,如果有很多線程在等待獲取鎖,那么也只有一個線程可以獲得鎖。

下面的代碼演示了在 x 的增加語句前后使用鎖:

from  threading import Thread, Lockdef inc_with_lock(lock):global xfor _ in range(1000000):lock.acquire()x += 1lock.release()# 全局變量
x  =  0
mylock = Lock()# 創建線程
t1 = Thread(target=inc_with_lock, args=(mylock,), name="線程 1")
t2 = Thread(target=inc_with_lock, args=(mylock,), name="線程 2")# 啟動線程
t1.start()
t2.start()# 等待線程結束
t1.join()
t2.join()print("最后 x 的值是:", x)

以上代碼的輸出結果是:

最后 x 的值是: 2000000

使用鎖后,x 的值就會一直是 2000000。·lock 對象確保任一時間,只有一個線程操作 x

<完>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896704.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux操作系統5-進程信號3(信號的捕捉流程,信號集,sigaction)

上篇文章&#xff1a;Linux操作系統5-進程信號3&#xff08;信號的保存, 用戶態與內核態&#xff0c;內核空間&#xff09;-CSDN博客 本篇Gitee倉庫&#xff1a;???????myLerningCode/l26 橘子真甜/Linux操作系統與網絡編程學習 - 碼云 - 開源中國 (gitee.com) 本篇重點…

【機器學習chp10】降維——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目錄 一、降維的意義與本質 1、意義 2、本質 3、常見降維方法 &#xff08;1&#xff09;線性降維 &#xff08;2&#xff09;非線性降維 二、基于重構的降維 1、PCA 2、核化PCA &#xff08;1&#xff09;實現過程 步驟一&#xff1a;數據映射與核函數定義 步驟二…

代碼的解讀——自用

代碼來自&#xff1a;https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能總結 該腳本用于執行一個 弱監督語義分割&#xff08;WSSS&#xff09; 的完整流程&#xff0c;包含三個階段&#xff1a; Stage1&#xff1a;訓…

Powershell和BTEQ工具實現帶多組參數和標簽的Teradata數據庫批量數據導出程序

設計一個基于多個帶標簽SQL模板作為配置文件和多組參數的Powershell代碼程序和BTEQ工具&#xff0c;實現根據不同的輸入參數&#xff0c;自動批量地將Teradata數據庫的數據導出為CSV文件到指定目錄上&#xff0c;標簽和多個參數&#xff08;以“_”分割&#xff09;為組成導出數…

CF 118A.String Task(Java實現)

題目分析 輸入一個字符串&#xff0c;遍歷每一個字符&#xff0c;如果是元音字母就刪除&#xff0c;輔音字母就在其前面增加一個.&#xff0c;且所有字母輸出都是小寫。 思路分析 將輸入的字符串改為字符數組&#xff0c;考慮到任意位置插入的情況&#xff0c;所以主要選擇Lin…

LLM進階

prologue&#xff1a;最近大模型火出天際&#xff0c;I’m definitely aware I’m late to the party&#xff0c;2022年畢業之后就很少在系統的跟蹤一個domain了&#xff0c;所以這次下定決心要跟蹤一下大模型的技術細節和實現過程&#xff0c;不做AI丁真 本文三條主線&#…

Ubuntu 下查看進程 PID 和終止進程方法

查看進程 PID 使用 ps 命令: ps aux | grep <process_name>例如&#xff0c;查看名為 python 的進程&#xff1a; ps aux | grep python使用 pgrep 命令: pgrep <process_name>例如&#xff0c;查看名為 python 的進程&#xff1a; pgrep python使用 top 命令: top…

Java基礎語法練習34(抽象類-abstract)(抽象類最佳實踐-模版設計模式)

一抽象類-abstract、 父類方法不確定性的問題故將該方法設計為抽象類&#xff08;沒有實現的方法&#xff09;&#xff0c;但一般來說被子類繼承然后實現 細節&#xff1a; 1、抽象類不可以被實例化 2、抽象類可以不包含抽象方法而且可以有實現的其他非抽象方法 3、abstra…

Android SDK與NDK的區別

Android SDK&#xff08;Software Development Kit&#xff09;與NDK&#xff08;Native Development Kit&#xff09;在Android應用開發中各自扮演著重要角色&#xff0c;它們之間存在顯著的區別。以下是Android SDK與NDK的主要區別&#xff1a; 一、定義與用途 Android SDK…

DeepSeek在PiscTrace上完成個性化處理需求案例——光流法將煙霧動態可視化

引言&#xff1a;PiscTrace作為開放式的視圖分析平臺提供了固定格式的類型參數支持個性化定制處理需求&#xff0c;本文一步步的實現光流分析按照不同需求根據DeepSeek的代碼處理視頻生成數據。 光流法&#xff08;Optical Flow&#xff09;是一種基于圖像序列的計算機視覺技術…

Linux網絡 TCP全連接隊列與tcpdump抓包

TCP全連接隊列 在 Linux 網絡中&#xff0c;TCP 全連接隊列&#xff08;也稱為 Accept 隊列&#xff09;是一個重要的概念&#xff0c;用于管理已經完成三次握手&#xff0c;即已經處于 established 狀態但尚未被應用程序通過 accept( ) 函數處理的 TCP 連接&#xff0c;避免因…

flex布局自定義一行幾欄,靠左對齊===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…

使用3090顯卡部署Wan2.1生成視頻

layout: post title: 使用3090顯卡部署Wan2.1生成視頻 catalog: true tag: [Kubernetes, GPU, AI] 使用3090顯卡部署Wan2.1生成視頻 1. 環境說明2. 模型下載3. 克隆倉庫4. 安裝依賴5. 生成視頻 5.1. 使用generate腳本生成5.2. 使用gradio啟動UI界面生成 5.2.1. 啟動gradio服務5…

Prompt生成-Prompt工程師

# Role:Prompt工程師 ## Attention&#xff1a; - 我總是被老板罵寫不出來Prompt&#xff0c;如果你能寫出優秀的Prompt會避免讓我失業&#xff0c;請認真思考并竭盡全力&#xff0c;拜托了&#xff01; ## Profile: - Author:pp - Version:2.1 - Language:中文 - Description:…

數據存儲:一文掌握RabbitMQ的詳細使用

文章目錄 一、RabbitMQ簡介二、RabbitMQ的概述2.1 基本概念2.2 實際應用場景三、RabbitMQ的安裝與配置3.1 安裝RabbitMQ3.2 啟用管理插件四、使用Python操作RabbitMQ4.1 安裝Pika庫4.2 生產者示例4.3 消費者示例4.4 發布/訂閱模式示例五、RabbitMQ的高級特性5.1 消息持久化5.2 …

Mixture of Experts與Meta Learning深度學習中的兩大變革性技術

1. 引言 隨著人工智能&#xff08;AI&#xff09;和深度學習技術的迅猛發展&#xff0c;創新的架構和算法不斷涌現&#xff0c;推動了智能系統性能的顯著提升。在這些技術中&#xff0c;Mixture of Experts (MoE) 和 Meta Learning Algorithms (MLA) 是兩種極具影響力的方法。…

【新立電子】探索AI眼鏡背后的黑科技,FPC如何賦能實時翻譯與語音識別,點擊了解未來溝通的新方式!

在全球化的今天&#xff0c;語言障礙成為人們溝通與交流的一大難題。AI眼鏡作為一種新興的智能設備&#xff0c;正在通過實時翻譯與語音識別功能&#xff0c;打破語言壁壘&#xff0c;為人們提供無縫溝通的解決方案。FPC在AI眼鏡中的應用&#xff0c;為實時翻譯與語音識別功能的…

(十 三)趣學設計模式 之 模版方法模式!

目錄 一、 啥是模板方法模式&#xff1f;二、 為什么要用模板方法模式&#xff1f;三、 模板方法模式的實現方式四、 模板方法模式的優缺點五、 模板方法模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&a…

模型和數據集的平臺之在Hugging Face上進行模型下載、上傳以及創建專屬Space

模型下載 步驟&#xff1a; 注冊Hugging Face平臺 https://huggingface.co/ 新建一個hf_download_josn.py 文件 touch hf_download_josn.py 編寫hf_download_josn.py文件 import os from huggingface_hub import hf_hub_download# 指定模型標識符 repo_id "inter…

【彈性計算】彈性裸金屬服務器和神龍虛擬化(二):適用場景

彈性裸金屬服務器和神龍虛擬化&#xff08;二&#xff09;&#xff1a;適用場景 1.混合云和第三方虛擬化軟件部署2.高隔離容器部署3.高質量計算服務4.高速低時延 RDMA 網絡支持場景5.RISC CPU 支持6.GPU 性能無損輸出 公共云服務提供商推出 彈性裸金屬服務器&#xff0c;很顯然…