python執行緒知識點補充

2021-09-10 06:10:53 字數 2645 閱讀 1796

在多個執行緒共享資源的時候,如果兩個執行緒分別占有一部分資源,並且同時等待對方的資源,就會造成死鎖現象。如果鎖之間相互巢狀,就有可能出現死鎖。因此盡量不要出現鎖之間的巢狀。

下方就是乙個死鎖型別,函式會卡在那不動,無法執行

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...