[pythonマルチスレッドプログラミング]反発ロックを使用した同期スレッド
4187 ワード
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time, threading
# :
balance = 0
muxlock = threading.Lock()
def change_it(n):
# , 0:
global balance
balance = balance + n
balance = balance - n
def run_thread(n):
# , 0
for i in range(100000):
change_it(n)
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t3 = threading.Thread(target=run_thread, args=(9,))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print balance
結果:
[/data/web/test_python]$ python multhread_threading.py
0
[/data/web/test_python]$ python multhread_threading.py
61
[/data/web/test_python]$ python multhread_threading.py
0
[/data/web/test_python]$ python multhread_threading.py
24
反発ロック同期
上記の例では、マルチスレッドプログラミングの最も一般的な問題であるデータ共有について説明します.複数のスレッドが共有データを変更する場合は、同期制御が必要です.スレッド同期は、複数のスレッドが競合リソースに安全にアクセスすることを保証し、最も簡単な同期メカニズムは、反発ロックを導入することです.反発ロックは、リソースにロック/非ロックのステータスを導入します.スレッドが共有データを変更する場合は、まずロックします.リソースのステータスは「ロック」で、他のスレッドは変更できません.スレッドがリソースを解放するまで、リソースのステータスが「非ロック」になり、他のスレッドがリソースを再ロックできます.反発ロックは、毎回1つのスレッドのみが書き込み操作を行うことを保証し、マルチスレッドの場合のデータの正確性を保証します.
threadingモジュールにはロッククラスが定義されており、ロックの処理を容易にすることができます.
# mutex = threading.Lock()
# mutex.acquire([timeout])
# mutex.release()
ここで、ロックメソッドacquireは、タイムアウト時間のオプションパラメータtimeoutを有することができる.timeoutが設定されている場合、タイムアウト後に戻り値によりロックされているか否かを判断することができ、他の処理を行うことができる.反発ロックを使用して上記の例を実装するコードは、次のとおりです.
balance = 0
muxlock = threading.Lock()
def change_it(n):
# ,
muxlock.acquire()
global balance
balance = balance + n
balance = balance - n
# ,
muxlock.release()
def run_thread(n):
for i in range(10000):
change_it(n)
ロックした結果、データが正しいことを確認できます.
[/data/web/test_python]$ python multhread_threading.py
0
[/data/web/test_python]$ python multhread_threading.py
0
[/data/web/test_python]$ python multhread_threading.py
0
[/data/web/test_python]$ python multhread_threading.py
0
作者:cooffeelis
リンク:https://www.jianshu.com/p/af3aaf5f9291]