検索
ホームページバックエンド開発Python チュートリアルPython マルチスレッド プログラミング 3: ミューテックス ロックを使用してスレッドを同期する

質問です

前のセクションの例では、各スレッドは互いに独立しており、相互に関係はありません。ここで例を想定します。グローバル カウント num があり、各スレッドはこのグローバル カウントを取得し、num に基づいて何らかの処理を実行し、その後 num に 1 を加算します。次のようなコードを書くのは簡単です:

# encoding: UTF-8
import threading
import time
  
class MyThread(threading.Thread):
    def run(self):
        global num
        time.sleep(1)
        num = num+1
        msg = self.name+' set num to '+str(num)
        print msg
num = 0
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == '__main__':
    test()

しかし、実行結果は正しくありません:


Thread-5 set num to 2

Thread-3 set num to 3

Thread-2 set num to 5

Thread-1 set num to 5

Thread-4 set num to 4


問題の理由は、同じリソースへの複数のスレッドのアクセスが制御されていないため、データが損傷し、スレッド操作の結果は予測できません。この現象は「スレッドアンセーフ」と呼ばれます。

ミューテックス ロックの同期

上記の例は、マルチスレッド プログラミングの最も一般的な問題、つまりデータ共有につながります。ある共有データを複数のスレッドで変更する場合、同期制御が必要となります。

スレッド同期により、複数のスレッドが競合するリソースに安全にアクセスできるようになります。最も簡単な同期メカニズムは、ミューテックス ロックを導入することです。ミューテックスは、ロック/ロック解除という状態をリソースに導入します。スレッドが共有データを変更したい場合は、まずそのリソースをロックする必要があり、その時点でリソースのステータスは「ロック」されており、スレッドがリソースを解放してリソースのステータスを「」に変更するまで、他のスレッドはそれを変更できません。ロックが解除されました」と表示された場合、他のスレッドはリソースを再度ロックできます。ミューテックス ロックは、一度に 1 つのスレッドだけが書き込み操作を実行することを保証するため、マルチスレッド状況でのデータの正確性が保証されます。

Lock クラスはスレッド モジュールで定義されており、ロックを簡単に処理できます:

#Create lock

mutex = threading.Lock()

#Lock

mutex.acquire([timeout])

#Release

mutex.release()

このうち、lockメソッドacquireはタイムアウト付きのパラメータtimeoutをオプションで持つことができます。タイムアウトが設定されている場合、戻り値を使用してタイムアウト後にロックが取得されたかどうかを判断できるため、他の処理を実行できます。

ミューテックスを使用して上記の例を実装するコードは次のとおりです:

import threading
import time
  
class MyThread(threading.Thread):
    def run(self):
        global num
        time.sleep(1)
  
        if mutex.acquire(1): 
            num = num+1
            msg = self.name+' set num to '+str(num)
            print msg
            mutex.release()
num = 0
mutex = threading.Lock()
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == '__main__':
    test()

実行結果:


Thread-3 set num to 1

Thread-4 set num to 2

Thread-5 set num to 3

Thread-2 set num to 4

Thread-1 set num to 5

ミューテックス ロックを追加した後の実行結果が期待どおりであることがわかります。

同期ブロッキング

スレッドがロックのacquire()メソッドを呼び出してロックを取得すると、ロックは「ロック」状態になります。一度に 1 つのスレッドだけがロックを取得できます。このときに別のスレッドがロックを取得しようとすると、そのスレッドは「ブロック」されます。これを「同期ブロック」と呼びます (マルチスレッドの基本概念を参照)。

ロックを所有するスレッドがロックの release() メソッドを呼び出してロックを解放するまで、ロックは「ロック解除」状態になります。スレッド スケジューラは、同期ブロッキング状態にあるスレッドの 1 つを選択してロックを取得し、そのスレッドを実行状態にします。

ミューテックス ロックの最も基本的な内容は次のとおりです。次のセクションでは、リエントラント ロック (RLock) とデッドロックの問題について説明します。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonでタプルの理解が可能ですか?はいの場合、どうしてそうでない場合は?Pythonでタプルの理解が可能ですか?はいの場合、どうしてそうでない場合は?Apr 28, 2025 pm 04:34 PM

記事では、構文のあいまいさのためにPythonにおけるタプル理解の不可能性について説明します。 Tupple式を使用してTuple()を使用するなどの代替は、Tuppleを効率的に作成するためにお勧めします。(159文字)

Pythonのモジュールとパッケージとは何ですか?Pythonのモジュールとパッケージとは何ですか?Apr 28, 2025 pm 04:33 PM

この記事では、Pythonのモジュールとパッケージ、その違い、および使用について説明しています。モジュールは単一のファイルであり、パッケージは__init__.pyファイルを備えたディレクトリであり、関連するモジュールを階層的に整理します。

PythonのDocstringとは何ですか?PythonのDocstringとは何ですか?Apr 28, 2025 pm 04:30 PM

記事では、PythonのDocstrings、それらの使用、および利点について説明します。主な問題:コードのドキュメントとアクセシビリティに関するドキュストリングの重要性。

ラムダの機能とは何ですか?ラムダの機能とは何ですか?Apr 28, 2025 pm 04:28 PM

記事では、ラムダの機能、通常の機能との違い、およびプログラミングシナリオでの有用性について説明します。すべての言語がそれらをサポートするわけではありません。

Pythonで休憩、続行、パスとは何ですか?Pythonで休憩、続行、パスとは何ですか?Apr 28, 2025 pm 04:26 PM

記事では、PythonでのBreak、継続、およびパスについて説明し、ループの実行とプログラムの流れの制御における役割について説明します。

Pythonのパスとは何ですか?Pythonのパスとは何ですか?Apr 28, 2025 pm 04:25 PM

この記事では、機能やクラスなどのコード構造のプレースホルダーとして使用されるヌル操作であるPythonの「パス」ステートメントについて説明し、構文エラーなしで将来の実装を可能にします。

Pythonの引数として関数を渡すことはできますか?Pythonの引数として関数を渡すことはできますか?Apr 28, 2025 pm 04:23 PM

記事では、パス機能をPythonの引数として説明し、モジュール性やソートやデコレーターなどのユースケースなどの利点を強調しています。

Pythonの /と//の違いは何ですか?Pythonの /と//の違いは何ですか?Apr 28, 2025 pm 04:21 PM

記事は、Pythonの /および//オペレーターについて説明します: /真の分割の場合、//床部門の場合。主な問題は、それらの違いとユースケースを理解することです。CharacterCount:158

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、