Python之守護執行緒與鎖

2021-09-18 07:51:46 字數 4625 閱讀 9607

# 守護執行緒隨著子執行緒結束而結束,與守護程序不一樣--守護程序隨著主程序**執行完畢而結束

# from threading import thread

# import time

## def func1():

# while true:

# time.sleep(1)

# print("in func1")

# def func2():

# print('func2 start...')

# time.sleep(5)

# print('func2 end...')

# if __name__ == '__main__':

# t1 = thread(target=func1)

# t1.daemon = true

# t1.start()

# t2 = thread(target=func2)

# t2.start()

# print('主線程**完畢')

'''輸出結果:

func2 start...

主線程**完畢

in func1

in func1

in func1

in func1

func2 end...

'''# 多執行緒之資料安全問題

# from threading import thread

# import time

## # 模擬計算在cpu中發生的過程,且時間放大

# def func():

# global n

# tmp = n

# time.sleep(1)

# n = tmp - 1

# if __name__ == '__main__':

# n = 10

# t_lst =

# for i in range(10):

# t = thread(target=func)

# t.start()

# for t in t_lst:t.join()

# print(n) # 9

# 10個執行緒對同乙個資料執行減1操作,得到的結果卻是9,發生了資料安全,因此要對資料加鎖

# from threading import thread

# from threading import lock

# import time

## # 模擬計算在cpu中發生的過程,且時間放大

# def func(lock):

# global n

# # 請求鎖

# lock.acquire()

# tmp = n

# time.sleep(1)

# n = tmp - 1

# # 釋放鎖

# lock.release()

# if __name__ == '__main__':

# n = 10

# # 例項化乙個鎖

# lock = lock()

# t_lst =

# for i in range(10):

# t = thread(target=func,args=(lock,))

# t.start()

# for t in t_lst:t.join()

# print(n) # 0 耗時10秒,相當於同步執行了

# 當呼叫多個鎖的時候容易造程死鎖問題

# from threading import thread

# from threading import lock

# import time

# # 假設乙個操作需要使用兩個鎖,func1先呼叫lock1

# def func1(name,lock1,lock2):

# lock1.acquire()

# print('%s拿到lock1'%(name))

# time.sleep(1)

# lock2.acquire()

# print('%s拿到lock2'%(name))

# time.sleep(1)

# print('%s執行被鎖的**'%(name))

# lock2.release()

# print('%s釋放lock2'%(name))

# time.sleep(1)

# lock1.release()

# print('%s釋放lock1'%(name))

# # func2先呼叫lock2

# def func2(name,lock1,lock2):

# lock2.acquire()

# print('%s拿到lock2'%(name))

# time.sleep(1)

# lock1.acquire()

# print('%s拿到lock1'%(name))

# time.sleep(1)

# print('%s執行被鎖的**'%(name))

# lock1.release()

# print('%s釋放lock1'%(name))

# time.sleep(1)

# lock2.release()

# print('%s釋放lock2'%(name))

# if __name__ == '__main__':

# lock1 = lock()

# lock2 = lock()

# t1 = thread(target=func1,args=('t1',lock1,lock2))

# t1.start()

# t2 = thread(target=func2,args=('t2',lock1,lock2))

# t2.start()

'''輸出結果:

t1拿到lock1

t2拿到lock2

程式卡死--發生死鎖

'''# 針對死鎖情況,可以使用遞迴鎖解決

# from threading import thread

# from threading import rlock

# import time

# # 假設乙個操作需要使用兩個鎖,func1先呼叫lock1

# def func1(name,lock1,lock2):

# lock1.acquire()

# print('%s拿到lock1'%(name))

# time.sleep(1)

# lock2.acquire()

# print('%s拿到lock2'%(name))

# time.sleep(1)

# print('%s執行被鎖的**'%(name))

# lock2.release()

# print('%s釋放lock2'%(name))

# time.sleep(1)

# lock1.release()

# print('%s釋放lock1'%(name))

# # func2先呼叫lock2

# def func2(name,lock1,lock2):

# lock2.acquire()

# print('%s拿到lock2'%(name))

# time.sleep(1)

# lock1.acquire()

# print('%s拿到lock1'%(name))

# time.sleep(1)

# print('%s執行被鎖的**'%(name))

# lock1.release()

# print('%s釋放lock1'%(name))

# time.sleep(1)

# lock2.release()

# print('%s釋放lock2'%(name))

# if __name__ == '__main__':

# lock2 = lock1 = rlock()

# t1 = thread(target=func1,args=('t1',lock1,lock2))

# t1.start()

# t2 = thread(target=func2,args=('t2',lock1,lock2))

# t2.start()

'''遞迴鎖其實是乙個鎖,但是可以被多處acquire

'''

python執行緒鎖 守護執行緒,程序鎖 守護程序

1 守護程序 1.1 什麼是守護程序?1 守護程序會在主程序 執行結束的情況下,立即結束。2 守護程序本身其實就是乙個子程序。3 主程序在其 結束後已經執行完畢 守護程序在此時就被 然後主程序會一直等非守護的子程序都執行完畢後 子程序的資源才會結束。1.2 為什麼要用守護程序?1 守護程序本身就是乙...

執行緒 守護執行緒與非守護執行緒

什麼是守護執行緒?非守護執行緒好理解,就是程式中前端執行的執行緒,我個人理解為常用於處理主動事務的執行緒。守護執行緒 顧名思義,用來守護處理事務的執行緒。它主要執行在程式後端,最有代表的例子gc執行緒,就是守護執行緒。守護執行緒的特點 實現守護執行緒,驗證非守護執行緒結束時,守護執行緒也中斷。cre...

守護執行緒 與守護程序

守護執行緒 守護執行緒會等待所有非守護執行緒執行結束才結束 守護程序 無論子程序有沒有執行結束,當主程式的 執行完畢,都會結束 def f1 time.sleep 2 print 1號執行緒 def f2 time.sleep 3 print 2號執行緒 if name main t1 thread...