[解決済み] Pythonのスレッド化。スレッドをロックするにはどうしたらいいですか?
2022-03-01 13:21:26
質問
スレッドと並行処理の基本を理解しようとしています。2つのスレッドが1つの共有リソースに繰り返しアクセスしようとする簡単なケースを考えています。
コードです。
import threading
class Thread(threading.Thread):
def __init__(self, t, *args):
threading.Thread.__init__(self, target=t, args=args)
self.start()
count = 0
lock = threading.Lock()
def increment():
global count
lock.acquire()
try:
count += 1
finally:
lock.release()
def bye():
while True:
increment()
def hello_there():
while True:
increment()
def main():
hello = Thread(hello_there)
goodbye = Thread(bye)
while True:
print count
if __name__ == '__main__':
main()
そこで、2つのスレッドがあり、両方ともカウンターをインクリメントしようとしています。もしスレッド 'A' が
increment()
は、その
lock
が成立し、Aが解除されるまでBがアクセスできないようにする。
を実行すると、そうでないことが明らかになります。ランダムなデータレース的な増分がすべて得られるのです。
ロックオブジェクトは具体的にどのように使われているのでしょうか?
さらに、スレッド関数の中にロックを入れてみましたが、まだうまくいきません。
解決方法は?
ロックを使っているうちに、もう少し処理を遅くしてブロックさせれば、かなり効果があることがわかります。重要なコードの一部をロックで囲むというのは、正しいアイデアでしたね。この例では、ロックが解除されるのをそれぞれがどのように待っているかを示すために、少し調整しています。
import threading
import time
import inspect
class Thread(threading.Thread):
def __init__(self, t, *args):
threading.Thread.__init__(self, target=t, args=args)
self.start()
count = 0
lock = threading.Lock()
def incre():
global count
caller = inspect.getouterframes(inspect.currentframe())[1][3]
print "Inside %s()" % caller
print "Acquiring lock"
with lock:
print "Lock Acquired"
count += 1
time.sleep(2)
def bye():
while count < 5:
incre()
def hello_there():
while count < 5:
incre()
def main():
hello = Thread(hello_there)
goodbye = Thread(bye)
if __name__ == '__main__':
main()
サンプル出力です。
...
Inside hello_there()
Acquiring lock
Lock Acquired
Inside bye()
Acquiring lock
Lock Acquired
...
関連
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] データ型が理解できない
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない