線程鎖

'''
 線程鎖
 如果想保證共享數據的安全性,則需要添加Lock。(只要加鎖則運算的速度就會變慢)
   步驟:
   from threading import Lock
   1. lock = Lock()  創建鎖對象
   2. 獲取鎖:
      lock.acquire()  默認是阻塞,可以設置阻塞超時時間 timeout=秒

      釋放鎖:
      lock.release()
   總結: 哪段代碼操作共享數據,則對其加鎖
'''
import threading

number = 0


def task1():
    global number
    # 開始加鎖
    lock.acquire()  # 獲取
    for i in range(300000):
        number += 1
    # 釋放鎖
    lock.release()  # 釋放
    print('{}的number值是:{}'.format(threading.current_thread().name, number))


def task2():
    global number
    # 開始加鎖
    lock.acquire()  # 獲取
    for i in range(300000):
        number += 1
    # 釋放鎖
    lock.release()  # 釋放
    print('{}的number值是:{}'.format(threading.current_thread().name, number))


if __name__ == '__main__':
    lock = threading.Lock()

    t1 = threading.Thread(target=task1)
    t2 = threading.Thread(target=task2)

    t1.start()
    t2.start()

    t1.join()
    t2.join()
    print('最後獲取number 的值是:', number)

import threading
from threading import Lock
from time import sleep


def task1():
    lock.acquire()
    print('{}拿到鎖了...'.format(threading.current_thread().name))
    sleep(10)
    lock.release()
    print('{}釋放鎖了...'.format(threading.current_thread().name))


def task2():
    lock.acquire(timeout=5) # 線程2獲取鎖,如果鎖被佔用則當前線程就會阻塞等待
    print('{}拿到鎖了...'.format(threading.current_thread().name))
    sleep(10)
    try:
        lock.release()
    except:
        print('沒有拿到鎖,是超時進入代碼執行的...')
    else:
        print('{}釋放鎖了...'.format(threading.current_thread().name))


if __name__ == '__main__':
    lock = Lock()

    t1 = threading.Thread(target=task1)
    t2 = threading.Thread(target=task2)

    t1.start()
    t2.start()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章