検索
ホームページバックエンド開発Python チュートリアルPythonスレッドでの同期ロックの詳しい説明

Pythonスレッドでの同期ロックの詳しい説明

Apr 27, 2018 am 10:01 AM
python詳しい説明

この記事では、主に Python スレッドの同期ロックに関する情報を詳しく紹介します。興味のある方は参考にしてください。

マルチスレッドを使用するアプリケーションでスレッドの安全性を確保する方法と、スレッド間の同期などの問題について説明します。共有変数へのアクセスは非常に困難な問題であり、マルチスレッドを使用するときに直面する問題でもあります。これは、Python のマルチスレッドを使用してロック Rlock セマフォ条件を使用して同期を確保します。スレッド、後者は共有変数へのアクセスの相互排他を保証します

Lock & RLock: Mutex は、共有変数へのマルチスレッド アクセスを保証するために使用されます
Semaphore オブジェクト: Lock mutex の拡張バージョンであり、複数のスレッドが所有できます。一方、Lock は同時に特定のスレッドのみが所有できます。
イベント オブジェクト: スレッド間の通信方法であり、シグナルに相当します。あるスレッドが別のスレッドにシグナルを送信し、そのスレッドに操作を実行させることができます。
条件オブジェクト: 特定のイベントがトリガーされるか、特定の条件が満たされた場合にのみデータを処理できます

1. ロック (ミューテックス ロック)

ロックの要求 - ロック プールに入って待機 - ロックの取得 - ロック - ロックの解放

Lock (コマンドロック) は、利用可能な最も低いレベルの同期コマンドです。 Lock がロック状態にある場合、Lock は特定のスレッドによって所有されていません。 Lock には、ロックと非ロックの 2 つの状態と 2 つの基本メソッドが含まれています。

Lock はロック プールを持つものと考えることができます。スレッドがロックを要求すると、スレッドはロックを取得した後にプールから解放されるまでプールに置かれます。状態図では、プール内のスレッドは同期ブロッキング状態にあります。

構築メソッド:
Lock()

インスタンスメソッド:
acquire([timeout]): スレッドを同期ブロッキング状態にし、ロックの取得を試みます。
release(): ロックを解放します。スレッドは使用前にロックを取得する必要があります。取得しないと例外がスローされます。

if mutex.acquire():
 counter += 1
 print "I am %s, set counter:%s" % (self.name, counter)
  mutex.release()

2. RLock (リエントラントロック)

RLock (リエントラントロック) は、同じスレッドによって複数回要求できる同期命令です。 RLock は、「所有スレッド」と「再帰レベル」の概念を使用します。ロック状態では、RLock はスレッドによって所有されます。 RLock を所有するスレッドは、acquire() を再度呼び出すことができ、ロックを解放するには、同じ回数 release() を呼び出す必要があります。

RLock には、ロック プールと初期値 0 のカウンターが含まれていると考えることができます。acquire()/release() が正常に呼び出されるたびに、カウンターは +1/-1 になり、0 の場合はカウンターが増加します。 、ロックは解除された状態です。

構築メソッド:
RLock()

インスタンスメソッド:
acquire([timeout])/release(): Lockと同様。

3. セマフォ (共有オブジェクト アクセス)

セマフォについてもう一度話しましょう。正直に言うと、セマフォは私が以前に同様の実装を行うために使用した最新の同期ロックです。すべて、Rlock ではロックとロック解除をペアで行う必要があります。 。 。

セマフォは組み込みカウンターを管理します。
acquire() が呼び出されるたびに組み込みカウンターは -1 になります。
release() が呼び出される場合は組み込みカウンターは +1 になります。カウンタが 0 の場合、acquire() は、他のスレッドが release() を呼び出すまでスレッドをブロックします。

コードに直接アクセスして、セマフォを 3 に制御します。つまり、3 つのスレッドがこのロックを同時に使用でき、残りのスレッドはブロックして待機することしかできません...

#coding:utf-8
#blog xiaorui.cc
import time
import threading

semaphore = threading.Semaphore(3)

def func():
 if semaphore.acquire():
  for i in range(3):
   time.sleep(1)
   print (threading.currentThread().getName() + '获取锁')
  semaphore.release()
  print (threading.currentThread().getName() + ' 释放锁')


for i in range(5):
 t1 = threading.Thread(target=func)
 t1.start()

4. イベント (スレッド間通信)

イベントには内部的にフラグが含まれており、最初は false です。

set() を使用して true に設定することも、clear() を使用して false にリセットすることもできます


もう 1 つの最も重要な関数は wait です。 (timeout=None)、イベントの内部フラグ ビットが true に設定されるかタイムアウトになるまで、現在のスレッドをブロックするために使用されます。内部フラグが true の場合、wait() 関数はそれを理解して戻ります。

import threading
import time

class MyThread(threading.Thread):
 def __init__(self, signal):
  threading.Thread.__init__(self)
  self.singal = signal

 def run(self):
  print "I am %s,I will sleep ..."%self.name
  self.singal.wait()
  print "I am %s, I awake..." %self.name

if __name__ == "__main__":
 singal = threading.Event()
 for t in range(0, 3):
  thread = MyThread(singal)
  thread.start()

 print "main thread sleep 3 seconds... "
 time.sleep(3)

 singal.set()

5. 条件 (スレッド同期)

条件は、Lock や RLock よりも高度な機能を提供し、複雑なスレッド同期の問題を制御できます。 threadiong.Condition は内部的に threadion オブジェクト (デフォルトは RLock) を維持します。これは、Condigtion オブジェクトの作成時にパラメータとして渡すことができます。 Condition には、acquire メソッドと release メソッドも用意されており、その意味はホストのacquire メソッドと release メソッドと同じです。実際には、単に内部ホスト オブジェクトの対応するメソッドを呼び出すだけです。 Condition は次のメソッドも提供します (特に注意: これらのメソッドは取得後にのみ呼び出すことができ、そうでない場合は RuntimeError 例外が報告されます):

Condition.wait([timeout]):


wait メソッドはリリースします。内部占有スレッドであり、スレッドは通知の受信後に起動されるか、タイムアウトになるまで中断されます (タイムアウト パラメーターが指定されている場合)。スレッドが目覚めてスレッドを再び占有すると、プログラムは実行を継続します。

Condition.notify():

一時停止されたスレッドを起動します (一時停止されたスレッドがある場合)。注:notify() メソッドは、占有されているメモリを解放しません。

Condition.notify_all()
Condition.notifyAll()

唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的琐。

对于Condition有个例子,大家可以观摩下。

from threading import Thread, Condition
import time
import random

queue = []
MAX_NUM = 10
condition = Condition()

class ProducerThread(Thread):
 def run(self):
  nums = range(5)
  global queue
  while True:
   condition.acquire()
   if len(queue) == MAX_NUM:
    print "Queue full, producer is waiting"
    condition.wait()
    print "Space in queue, Consumer notified the producer"
   num = random.choice(nums)
   queue.append(num)
   print "Produced", num
   condition.notify()
   condition.release()
   time.sleep(random.random())


class ConsumerThread(Thread):
 def run(self):
  global queue
  while True:
   condition.acquire()
   if not queue:
    print "Nothing in queue, consumer is waiting"
    condition.wait()
    print "Producer added something to queue and notified the consumer"
   num = queue.pop(0)
   print "Consumed", num
   condition.notify()
   condition.release()
   time.sleep(random.random())


ProducerThread().start()
ConsumerThread().start()

相关推荐:

python多线程之事件Event的使用详解

python线程池threadpool的实现

以上がPythonスレッドでの同期ロックの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonを使用した科学コンピューティングでアレイはどのように使用されていますか?Pythonを使用した科学コンピューティングでアレイはどのように使用されていますか?Apr 25, 2025 am 12:28 AM

Arraysinpython、特にvianumpy、arecrucialinscientificComputing fortheirefficienty andversitility.1)彼らは、fornumericaloperations、data analysis、andmachinelearning.2)numpy'simplementation incensuresfasteroperationsthanpasteroperations.3)arayableminablecickick

同じシステムで異なるPythonバージョンをどのように処理しますか?同じシステムで異なるPythonバージョンをどのように処理しますか?Apr 25, 2025 am 12:24 AM

Pyenv、Venv、およびAnacondaを使用して、さまざまなPythonバージョンを管理できます。 1)Pyenvを使用して、複数のPythonバージョンを管理します。Pyenvをインストールし、グローバルバージョンとローカルバージョンを設定します。 2)VENVを使用して仮想環境を作成して、プロジェクトの依存関係を分離します。 3)Anacondaを使用して、データサイエンスプロジェクトでPythonバージョンを管理します。 4)システムレベルのタスク用にシステムPythonを保持します。これらのツールと戦略を通じて、Pythonのさまざまなバージョンを効果的に管理して、プロジェクトのスムーズな実行を確保できます。

標準のPythonアレイでnumpyアレイを使用することの利点は何ですか?標準のPythonアレイでnumpyアレイを使用することの利点は何ですか?Apr 25, 2025 am 12:21 AM

numpyarrayshaveveraladvantages-averstandardpythonarrays:1)thealmuchfasterduetocベースのインプレンテーション、2)アレモレメモリ効率、特にlargedatasets、および3)それらは、拡散化された、構造化された形成術科療法、

アレイの均質な性質はパフォーマンスにどのように影響しますか?アレイの均質な性質はパフォーマンスにどのように影響しますか?Apr 25, 2025 am 12:13 AM

パフォーマンスに対する配列の均一性の影響は二重です。1)均一性により、コンパイラはメモリアクセスを最適化し、パフォーマンスを改善できます。 2)しかし、タイプの多様性を制限し、それが非効率につながる可能性があります。要するに、適切なデータ構造を選択することが重要です。

実行可能なPythonスクリプトを作成するためのベストプラクティスは何ですか?実行可能なPythonスクリプトを作成するためのベストプラクティスは何ですか?Apr 25, 2025 am 12:11 AM

craftexecutablepythonscripts、次のようになります

numpyアレイは、アレイモジュールを使用して作成された配列とどのように異なりますか?numpyアレイは、アレイモジュールを使用して作成された配列とどのように異なりますか?Apr 24, 2025 pm 03:53 PM

numpyarraysarasarebetterfornumeroperations andmulti-dimensionaldata、whilethearraymoduleissuitable forbasic、1)numpyexcelsinperformance and forlargedatasentassandcomplexoperations.2)thearraymuremememory-effictientivearientfa

Numpyアレイの使用は、Pythonで配列モジュール配列の使用と比較してどのように比較されますか?Numpyアレイの使用は、Pythonで配列モジュール配列の使用と比較してどのように比較されますか?Apr 24, 2025 pm 03:49 PM

NumPyArraySareBetterforHeavyNumericalComputing、whilethearrayarayismoreSuitableformemory-constrainedprojectswithsimpledatatypes.1)numpyarraysofferarays andatiledance andpeperancedatasandatassandcomplexoperations.2)thearraymoduleisuleiseightweightandmemememe-ef

CTypesモジュールは、Pythonの配列にどのように関連していますか?CTypesモジュールは、Pythonの配列にどのように関連していますか?Apr 24, 2025 pm 03:45 PM

ctypesallowsinging andmanipulatingc-stylearraysinpython.1)usectypestointerfacewithclibrariesforperformance.2)createc-stylearraysfornumericalcomputations.3)passarraystocfunctions foreffientientoperations.how、how、becuutiousmorymanagemation、performanceo

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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

DVWA

DVWA

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

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター