ホームページ  >  記事  >  バックエンド開発  >  Pythonスレッドロックの使い方(解析例)

Pythonスレッドロックの使い方(解析例)

乌拉乌拉~
乌拉乌拉~オリジナル
2018-08-23 17:42:061775ブラウズ

この記事では、Python スレッド ロックとは何かを見てみましょう。 Python のスレッド ロックと、Python プログラミングにおいてスレッド ロックが果たせる役割について学びます。

スレッド ロック (ミューテックス)

1 つのプロセスの下で複数のスレッドを開始でき、複数のスレッドが親プロセスのメモリ空間を共有します。つまり、それぞれ 2 つのスレッドがこのとき、2 つのスレッドが同じデータを同時に変更したい場合はどうなりますか?

ロックの使用:

ロックの作成
mutex = threading.Lock()

Lock
mutex.acquire([timeout ])

Release
mutex.release()

import time

import threading

def addNum():
    global num #在每个线程中都获取这个全局变量
    print('--get num:',num )
    time.sleep(1)
    num  -=1 #对此公共变量进行-1操作
num = 100  #设定一个共享变量
thread_list = []
for i in range(100):
    t = threading.Thread(target=addNum)
    t.start()
    thread_list.append(t)
for t in thread_list: #等待所有线程执行完毕
    t.join()
    
print('final num:', num )

通常、この num の結果は 0 になるはずですが、Python 2.7 で数回実行すると、最終的な出力結果が常に 0 であるとは限りません。実行するたびに結果が異なるのはなぜですか?はは、とても簡単です。2 つのスレッド A と B があるとします。このとき、num を 1 減らす必要があります。2 つのスレッドは同時に実行されているため、最初の時点で 2 つのスレッドによって num=100 が奪われてしまう可能性が非常に高いです。この初期変数は計算のために CPU に渡されます。スレッド A が計算を完了すると、結果は 99 になりますが、この時点ではスレッド B が計算を完了し、結果も 99 になります。CPU の結果の後2 つのスレッドの同時計算が num 変数に割り当てられると、結果は両方とも 99 になります。それではどうすればいいでしょうか?それはとても簡単です。各スレッドが公開データを変更したいとき、変更が完了する前に他のスレッドがデータを変更できないようにするために、データにロックを追加して、他のスレッドがデータを変更したいときに待機する必要があるようにすることができます。このデータに再度アクセスできるのは、変更を完了してロックを解除した後のみです。

#注: 3.x では実行しないでください。何らかの理由で、3.x での結果は常に正しいです。ロックが自動的に追加される可能性があります。

以上です この記事で解説する内容は、主に

python mutex lock に関する知識を中心に紹介していますので、上記の内容を理解するために活用していただければ幸いです。この記事で説明したことがあなたのお役に立ち、Python の学習が容易になることを願っています。

関連知識の詳細については、php 中国語 Web サイトの

Python チュートリアル 列を参照してください。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。