検索
ホームページバックエンド開発Python チュートリアルPython のマルチスレッド同期エラーを解決するにはどうすればよいですか?

Python のマルチスレッド同期の問題は、並行プログラムを作成するときによく発生する問題です。 Python には組み込みのスレッド モジュールがありますが、Global Interpreter Lock (GIL) が存在するため、Python のマルチスレッドは真の並列実行ではありません。ただし、場合によっては、Python プログラムの効率を向上させるためにマルチスレッドを使用する必要があります。この記事では、Python のマルチスレッド同期の問題を解決するためのいくつかの方法を紹介します。

1. ロック メカニズムの使用

ロックは、共有リソースへのマルチスレッド アクセスを同期する Python のメカニズムです。複数のスレッドが共有リソースに対して読み取りおよび書き込み操作を実行する場合、何も対策を講じないとデータの競合が発生し、結果の不一致が発生するため、一度に 1 つのスレッドのみが共有リソースにアクセスできるようにロックが必要です。

Python には、RLock と Lock という 2 つのロック メカニズムがあります。このうち、Lock はより効率的ですが、ロックが繰り返し所有されるとデッドロックの問題が発生します。 RLock は繰り返しのロック所有権をサポートしますが、効率は Lock よりわずかに低くなります。以下は、Lock の使用例です。

import threading

count = 0
lock = threading.Lock()

def hello():
    global count
    lock.acquire()
    for i in range(1000000):
        count += 1
    lock.release()

t1 = threading.Thread(target=hello)
t2 = threading.Thread(target=hello)
t1.start()
t2.start()
t1.join()
t2.join()
print(count)

ここで Lock は、共有変数 count の更新操作を保護するために使用され、複数のスレッドが count に同時にアクセスすることによって引き起こされる同期の問題を回避します。

2. 条件変数を使用する

条件変数は、スレッド間で通信するためのメカニズムであり、特定の条件が発生するのを待って他のスレッドに通知するためにスレッド間で使用されます。 Python の組み込みスレッド ライブラリでは、threading.Condition を使用して条件変数を作成できます。

次の例では、条件変数を使用してプロデューサー/コンシューマー モデルを実装します。

import threading
import time

queue = []
MAX_NUM = 5
condition = threading.Condition()

class ProducerThread(threading.Thread):
    def run(self):
        nums = range(5)
        global queue
        while True:
            condition.acquire()
            if len(queue) == MAX_NUM:
                print("队列已满,生产者等待")
                condition.wait()
                print("生产者被唤醒")
            num = nums.pop()
            queue.append(num)
            print("生产者生产了", num)
            condition.notifyAll()
            condition.release()
            time.sleep(1)


class ConsumerThread(threading.Thread):
    def run(self):
        global queue
        while True:
            condition.acquire()
            if not queue:
                print("队列为空,消费者等待")
                condition.wait()
                print("消费者被唤醒")
            num = queue.pop(0)
            print("消费者消费了", num)
            condition.notifyAll()
            condition.release()
            time.sleep(2)

if __name__ == '__main__':
    t1 = ProducerThread()
    t2 = ConsumerThread()
    t1.start()
    t2.start()
    t1.join()
    t2.join()

この例では、条件変数を使用してプロデューサーとコンシューマーの実行を制御します。キューがいっぱいになるとプロデューサー スレッドが待機し、キューが空になるとコンシューマ スレッドが待機します。新しいデータが生成または消費されると、待機中の他のスレッドに、notifyAll() メソッドを通じて通知されます。

3. キューの使用

キューは、スレッド間の同期と通信を実現するために使用できるスレッドセーフなデータ構造です。 Python では、キュー モジュールは、マルチスレッドをサポートする 2 つのキュー クラス、Queue と LifoQueue を提供します。前者は先入れ先出しキュー、後者は後入れ先出しキューです。 Queue を使用すると、ロックや条件変数を自分で記述するという問題を回避できます。

次の例では、Queue を使用してプロデューサー/コンシューマー モデルを実装します:

import threading
import time
import queue

q = queue.Queue()

class ProducerThread(threading.Thread):
    def run(self):
        nums = range(5)
        global q
        for num in nums:
            q.put(num)
            print("生产者生产了", num)
            time.sleep(1)


class ConsumerThread(threading.Thread):
    def run(self):
        global q
        while True:
            num = q.get()
            q.task_done()
            print("消费者消费了", num)
            time.sleep(2)

if __name__ == '__main__':
    t1 = ProducerThread()
    t2 = ConsumerThread()
    t1.start()
    t2.start()
    t1.join()
    t2.join()

この例では、Queue はプロデューサーとコンシューマーの間のバッファとして使用されます。プロデューサー スレッドはデータを生成し、データをキューに入れますが、コンシューマ スレッドはデータをキューから取り出して消費します。 Queue の put() メソッドと get() メソッドはスレッドセーフであり、同期にロックや条件変数を使用する必要はありません。

つまり、Python のマルチスレッド プログラミングは真の並列実行ではありませんが、一部の IO 集中型タスクのプログラムの効率を向上させることができます。ただし、マルチスレッド プログラムを作成する場合は、競合状態やデッドロックなどの問題を回避するために、スレッド間の同期と通信の問題に特別な注意を払う必要があります。マルチスレッド同期の問題は、ロック、条件変数、キューなどのメカニズムを通じて解決できます。

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

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

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

mPDF

mPDF

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

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

EditPlus 中国語クラック版

EditPlus 中国語クラック版

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