1. 程式人生 > >python學習筆記(62) Treading模組

python學習筆記(62) Treading模組

預設情況下主執行緒會等待子執行緒結束

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秒開啟