了解的知識點

2021-10-05 12:36:30 字數 4780 閱讀 4504

由兩個或兩個以上的程序或執行緒,因搶奪資源而造成的一種互相等待的現象。如果沒有外力,它們將一直等待

例如:from threading import thread, lock

import time

mutexa = lock(

)mutexb = lock(

)class

mythead

(thread)

:def

run(self)

: self.func1(

) self.func2(

)def

func1

(self)

: mutexa.acquire(

)print

('%s 搶到a鎖'

% self.name)

# 獲取當前執行緒名

mutexb.acquire(

)print

('%s 搶到b鎖'

% self.name)

mutexb.release(

) mutexa.release(

)def

func2

(self)

: mutexb.acquire(

)print

('%s 搶到b鎖'

% self.name)

time.sleep(2)

mutexa.acquire(

)print

('%s 搶到a鎖'

% self.name)

# 獲取當前執行緒名

mutexa.release(

) mutexb.release(

)if __name__ ==

'__main__'

:for i in

range(10

):t = mythead(

) t.start(

)結果為:

thread-

1 搶到a鎖

thread-

1 搶到b鎖

thread-

1 搶到b鎖

thread-

2 搶到a鎖

如需解決死鎖問題那麼應該使用遞迴鎖:

rlock內部維護著乙個lock和乙個counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。直到乙個執行緒所有的acquire都被release,其他的執行緒才能獲得資源。上面的例子如果使用rlock代替lock, 則不會發生死鎖:

更改方式:

from threading import rlock

mutexa = mutexb = rlock(

)

semaphore管理乙個內建的計數器,每當呼叫acquire(

)時內建計數器-

1,呼叫release(

)時內建計數器+

1,計數器不能小於0,當計數器為0時,acquire(

)將阻塞執行緒,直到其他執行緒呼叫release(

)from threading import thread, semaphore

import time

import random

sm = semaphore(5)

# 括號內寫數字 寫幾就表示開設幾個坑位

deftask

(name)

: sm.acquire(

)print

('%s 正在蹲坑'

% name)

time.sleep(random.randint(1,

5)) sm.release(

)if __name__ ==

'__main__'

:for i in

range(20

):t = thread(target=task, args=

('傘兵%s號'

%i,)

) t.start(

)

可以為執行緒提供乙個識別符號,當識別符號為真時才會執行

event.isset(

) 返回event的狀態值

event.wait(

) 如果event.isset()==

false那麼執行緒將會阻塞

event.

set(

)設定event的值為true

event.clear(

)設定event的值為false

from threading import thread, event

import time

event = event(

)# 造了乙個紅綠燈

deflight()

:print

('紅燈亮著的'

) time.sleep(3)

print

('綠燈亮了'

)# 告訴等待紅燈的人可以走了

event.

set(

)def

car(name)

:print

('%s 車正在燈紅燈'

%name)

event.wait(

)# 等待別人給你發訊號

print

('%s 車加油門飆車走了'

%name)

if __name__ ==

'__main__'

: t = thread(target=light)

t.start(

)for i in

range(20

):t = thread(target=car, args=

('%s'

%i,)

) t.start(

)

在佇列中我們可以放入值,也可以讓入元組。

當其值為元組時,那麼它取出的順序為值越小越先取出

import queue

# 我們現在使用的佇列都是只能在本地測試使用

# 1 佇列q 先進先出

# q = queue.queue(3)

# q.put(1)

# q.get()

# q.get_nowait()

# q.get(timeout=3)

# q.full()

# q.empty()

# 後進先出q

# q = queue.lifoqueue(3) # last in first out

# q.put(1)

# q.put(2)

# q.put(3)

# print(q.get()) # 3

# 優先順序q 你可以給放入佇列中的資料設定進出的優先順序

q = queue.priorityqueue(4)

q.put((10

,'111'))

q.put(

(100

,'222'))

q.put((0

,'333'))

q.put((-

5,'444'))

print

(q.get())

# (-5, '444')

# put括號內放乙個元祖 第乙個放數字表示優先順序

# 需要注意的是 數字越小優先順序越高!!!

gevent模組是在單cpu的情況下實現併發

from gevent import monkey;monkey.patch_all(

)import time

from gevent import spawn

"""gevent模組本身無法檢測常見的一些io操作

在使用的時候需要你額外的匯入一句話

from gevent import monkey

monkey.patch_all()

又由於上面的兩句話在使用gevent模組的時候是肯定要匯入的

所以還支援簡寫

from gevent import monkey;monkey.patch_all()

"""def

heng()

:print

('哼'

) time.sleep(2)

print

('哼'

)defha(

):print

('哈'

) time.sleep(3)

print

('哈'

)def

heiheihei()

:print

('heiheihei'

) time.sleep(5)

print

('heiheihei'

)start_time = time.time(

)g1 = spawn(heng)

g2 = spawn(ha)

g3 = spawn(heiheihei)

g1.join(

)g2.join(

)# 等待被檢測的任務執行完畢 再往後繼續執行

g3.join(

)# heng()

# ha()

# print(time.time() - start_time) # 5.005702018737793

print

(time.time(

)- start_time)

# 3.004199981689453 5.005439043045044

Android你需要了解的知識點

1 android四大元件 2 動畫 滑動衝突 自定義view 事件分發機制 4 android的資料儲存方式 5 ui布局 fragment的使用 6 記憶體 效能優化 的處理 螢幕適配 7 網路通訊的幾種實現 斷點續傳的實現 了解tcp ip udp http等網路協議 8 資料結構和演算法 9...

必須了解的一些IT知識點

有些知識感覺明白卻說不明白,博主把它定義為似懂非懂 趁著假期,趕緊掃盲!矽 半導體 矽谷 區域網 廣域網 網際網路 域域網 門戶 防火牆 頻寬 摩爾定律 安迪比爾定律 反摩爾定律,風險投資 天使投資 時間戳。矽 是一種化學元素,符號是si,有無定形矽和晶體矽兩種同素異形體,在地殼中,是第二豐富的元素...

學HTML需要先了解的知識點

1 html中不支援 空格 回車 製表符,它們都會被解析成乙個空白字元。2 utf 8 和 utf8 有什麼區別。utf 8 是標準寫法,php 在 windows 下邊英文不區分大小寫,所以也可以寫成 utf 8 utf 8 也可以把中間的 省略,寫成 utf8 一般程式都能識別,但也有例外 如下...