# 守護執行緒隨著子執行緒結束而結束,與守護程序不一樣--守護程序隨著主程序**執行完畢而結束# 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...