Pythonスレッドロック

1821 ワード

ワイヤロック
1つのデータに複数のスレッドが変更可能である場合、どのスレッドが変更されても他のスレッドに影響します.あるスレッドが使用済みになる前に、他のスレッドが変更できない場合は、このスレッドにスレッドロックを追加する必要があります.
lock
lockはローカルを重視し,ある変数が呼び出されず,他のスレッドが呼び出されない.
import threading
import time
import random
count = 0
def get_money(money):
    global count
    count += money
    count += money
    count -= money
lock = threading.Lock()
def lock_thread(money):
    #   
    lock.acquire()
    time.sleep(random.randint(1, 3))
    print('     ',threading.current_thread().name)
    get_money(money)
    time.sleep(random.randint(1,3))
    print('     ', threading.current_thread().name)
    #   
    lock.release()
thread1 = threading.Thread(target=lock_thread,name='thread1',args=(10000,))
thread2 = threading.Thread(target=lock_thread,name='thread2',args=(15000,))
thread1.start()
thread2.start()
print('hello world')

出力結果:
hello world
      thread1
      thread1
      thread2
      thread2

join
joinは全体を重視し,スレッド1は実行が完了せず,スレッド2は実行できない.
import threading
import time
import random
count = 0
def get_money(money):
    global count
    count += money
    count += money
    count -= money
def lock_thread(money):
    time.sleep(random.randint(1, 3))
    print('     ',threading.current_thread().name)
    get_money(money)
    time.sleep(random.randint(1,3))
    print('     ', threading.current_thread().name)
thread1 = threading.Thread(target=lock_thread,name='thread1',args=(10000,))
thread2 = threading.Thread(target=lock_thread,name='thread2',args=(15000,))
thread1.start()

thread1.join()

thread2.start()
print('hello world')

実行結果:
      thread1
      thread1
hello world
      thread2
      thread2