在多個執行緒共享資源的時候,如果兩個執行緒分別占有一部分資源,並且同時等待對方的資源,就會造成死鎖現象。如果鎖之間相互巢狀,就有可能出現死鎖。因此盡量不要出現鎖之間的巢狀。
下方就是乙個死鎖型別,函式會卡在那不動,無法執行
import threading ,time
def test1(num):
lock1.acquire()
print('test1....')
time.sleep(1)
lock2.acquire()
print('test1--->')
lock2.release()
lock1.release()
def test2(num):
lock2.acquire()
print('test2....')
lock1.acquire()
print('test2--->')
lock1.release()
lock2.release()
lock1=threading.lock()
lock2=threading.lock()
def main():
t1=threading.thread(target=test1,args=(1000,))
t2=threading.thread(target=test2,args=(1000,))
t1.start()
t2.start()
if __name__ == '__main__':
main()
二、執行緒佇列queue
佇列是一種先進先出(fifo)的儲存資料結構,就比如排隊上廁所乙個道理
1、建立乙個『佇列』隊象
import queue#匯入模組
q=queue.queue(maxsize=10)
queue.queue類即是乙個佇列的同步實現;佇列長度可為無限或者有限;可通過queue的建構函式的可選引數maxsize來設定佇列長度;如果maxsize小於1就表示佇列長度無限。
2、將乙個值放入佇列中 q.put(10)
呼叫佇列物件的put()方法在隊尾插入乙個專案。
3、將乙個值從佇列中取出q.get()
從隊頭刪除並返回乙個專案。如果取不到資料則一直等待。
4、q.qsize() 返回佇列的大小
5、q.empty() 如果隊列為空,返回true,反之false
6、q.full() 如果佇列滿了,返回true,反之false
7、q.put_nowait(item) ,如果取不到不等待,之間丟擲異常。
8、q.task_done() 在完成一項工作之後,q.task_done() 函式向任務已經完成的佇列傳送乙個訊號
9、q.join() 收到q.task_done()訊號後再往下執行,否則一直等待。或者最開始時沒有放資料join()不會阻塞。q.task_done() 和 q.join() 通常一起使用。
三、生產者與消費者模式
例如a是生產資料的執行緒,b是消費資料的執行緒。在多執行緒開發當中,如果a處理速度很快,而b處理速度很慢,那麼a就必須等待b處理完,才能繼續生產資料。同樣的道理,如果b的處理能力大於a,那麼b就必須等待a。為了解決這個問題於是引入了生產者和消費者模式。
生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。
打個比方就像,在餐廳,廚師做好菜,不需要直接和客戶交流,而是交給前台,而客戶去飯菜也不需要不找廚師,直接去前台領取即可。
如下**,模擬生產者和消費者關係
import queue,threading#首先呼叫queue,threading模組
q=queue.queue()#建立乙個執行緒佇列
def producer(name):
count=1
while count<=100:
#q.join()#等待task_done()傳送訊號
q.put(count)#存入佇列
print('{}正在炒第{}碗麵'.format(name,count))
count+=1
def customer(name):
count=1
while count<=100:
data=q.get(count)#從佇列中取出
print('{}正在吃第{}碗麵'.format(name,data))
count+=1
#q.task_done()#取完炒麵後傳送訊號
def main():
p1=threading.thread(target=producer,args=('海參',))
p2=threading.thread(target=customer,args=('小寶',))#注意!!!!姓名引數要加逗號,元組形式
p1.start()
p2.start()
if __name__=='__main__':
main()
print('來管辣根。。。')
Python裝飾器知識點補充
首先回顧一下關於python裝飾器以及程式設計客棧裝飾器模式 補全根據j a實現裝飾器模式的,我們可以寫下面一段 import logging def use logging func logging.warn s is running func.name return func def foo p...
正則知識點補充
1.與正規表示式有關的字串物件的方法 string.replace pattern,string 替換在正規表示式查詢中找到的文字。string.search pattern 通過正規表示式查詢相應的字串,只是判斷有無匹配的字串。如果查詢成功,search 返回匹配串的位置,否則返回 1。strin...
property知識點補充
1 synthesize和 dynamic作用 1 property有兩個對應的詞,乙個是 synthesize,乙個是 dynamic。如果 synthesize和 dynamic都沒寫,那麼預設的就是 syntheszie var var 2 synthesize的語義是如果你沒有手動實現set...