python學習筆記(62) Treading模組
阿新 • • 發佈:2018-11-28
預設情況下主執行緒會等待子執行緒結束
t.deamon = Ture # 主執行緒結束,子執行緒隨之結束
守護程序隨著主程序程式碼的執行結束而結束
守護執行緒會在主執行緒結束以後等待其他子執行緒的結束才結束
主程序在執行完自己的程式碼以後(守護程序結束)不會立即結束,而是等待子程序結束以後,回收子程序資源
主執行緒必須在其他非守護執行緒執行完畢以後才能結束(守護程序此時結束),因為主執行緒的結束意味著程序的結束,程序整體的資源都將被回收
聯想join()
################################################
程序鎖並不常用,一般用執行緒鎖
科學家吃麵問題(死鎖)
GIL鎖是加給執行緒,並不能完全保證資料安全(時間線輪轉)
Lock() # 互斥鎖
Rlock() # 遞迴鎖,拿幾個鑰匙加幾把鎖,在同一執行緒可以拿多次,為解決死鎖問題
fork_lock() = noodle_lock() = Rlock()
################################################
訊號量Semaphore()
事件Event()
import time
import random
from threading import Thread,Event
def connect_db(e):
count = 0
while count < 3:
e.wait(1) # 等待1秒
if e.is_set():
print('連線資料庫中...')
break
else:
count += 1
print('第%s次失敗...'%count)
else:
raise TimeoutError('資料庫連線超時')
def check_web(e):
time.sleep(random.randint(0,3))
e.set()
e = Event()
t1 = Thread(target=connect_db,args=(e,))
t2 = Thread(target=check_web,args=(e,))
t1.start()
t2.start()
###############################################
Condition # 條件,一種更復雜的鎖
c.acquire()
c.release()
c.wait()
c.notify(int) # 造一次性鑰匙
wait和notify必須都在ac和re之間
from threading import Thread,Condition
def func(con,i):
con.acquire()
con.wait()
print('在第%s個迴圈裡'%i)
con.release()
con = Condition()
for i in range(10):
Thread(target=func,args=(con,i)).start()
while True:
num = int(input('>>>'))
con.acquire()
con.notify(num)
con.release()
###############################################
定時器 Timer
Timer(2,func).start() #延時2秒開啟