筆記||Pyhthon3進階之多線程操做共享數據

# 多線程操做共享數據---------------------------------------------------------------多線程

# import threading
# 使用鎖
# 獲取鎖對象,全局惟一的
# lock = threading.Lock()ui

# 加鎖(獲取鎖) 未獲取到的線程會阻塞程序,知道獲取到鎖纔會往下執行
# lock.acquire()線程

# 釋放鎖 歸還鎖,其餘線程能夠拿去用了
# lock.release()對象

# 注意:加鎖和釋放鎖必須成對出現,不然就有可能形成死鎖資源


# 爲了不出現死鎖,推薦用以下上下文管理器在加鎖
# lock = threading.Lock()
# with lock: # with語句會在這個代碼塊執行前自動獲取鎖,在執行結束後自動釋放鎖
      # 這裏寫本身的代碼
      # passget

# 使用鎖的意義?
# 加鎖是爲了對鎖內資源進行鎖定,避免其餘線程篡改已被鎖定的資源同步


'''
線程同步:若是多個線程共同對某個數據進行修改,可能會出現不可預料的結果
爲了保證數據的正確性,須要多多個線程進行同步
使用Thread對象的Lock和Rlock能夠實現簡單的線程同步,這個兩個對象都有acquire方法和release方法
對於那些須要每次只容許一個線程操做的數據,能夠將其操做放到acquire和release方法之間。it

'''thread

import threading
import timeimport

num = 0
lock = threading.Lock()


def func(st):
       global num
       print(threading.currentThread().getName() + ' try to acquire the lock')
       if lock.acquire():
              print(threading.currentThread().getName() + ' acquire the lock.')
              print(threading.currentThread().getName() + " :%s" % str(num))
              num += 1
              time.sleep(st)
              print(threading.currentThread().getName() + ' release the lock.')
              lock.release()

t1 = threading.Thread(target=func, args=(8,))t2 = threading.Thread(target=func, args=(4,))t3 = threading.Thread(target=func, args=(2,))t1.start()t2.start()t3.start()

相關文章
相關標籤/搜索