python與執行緒

2021-09-02 01:15:41 字數 3863 閱讀 4657

同步概念:協同步調,按預定的先後次序執行

併發:不同時執行(執行緒)

並行:同時執行(程序)

同步原語:1.互斥鎖,2.訊號量原語,3.queue佇列

上下文管理器:with

死鎖:1.通過銀行家演算法解決,2.新增超時時間

模組:threading.thread

執行緒池:建立執行緒需要經過啟動、銷毀和執行3個過程。建立和用完的執行緒放入乙個容器中,使用者下次使用無須再開闢乙個新程序。節約開闢新執行緒時間,提高響應速度,也便於對執行緒進行管理。

守護執行緒:當主線程退出時,所有子執行緒都將終止,不管它們是否仍在工作。標記值為true時,表示執行緒不重要。注意需要在啟動執行緒之前設定。例如在伺服器執行緒執行在乙個無限迴圈裡等待使用者請求,當關閉程序即不會管該執行緒狀態直接退出,正常python程式是在所有非守護執行緒退出之後才退出。程序完成後不會死掉。

join(timeout=none):直至啟動的執行緒終止之前一直掛起;除非給出了timeout

gil鎖(全域性解析鎖)對多執行緒的影響:任意時刻只有乙個執行緒會被解析器執行。對於io密集型任務,執行緒在等待的時候會釋放gil,則多執行緒對此任務有很大效率提高。對於計算(cpu)密集型,由於不斷獲取執行緒,釋放,反而會降低效率。

1.建立thread例項,傳入乙個函式

import threading

from time import sleep, ctime

loops =[4

,2]def

loop

(nloop, nsec)

:print

('start loop {} at: {}'

.format

(nloop, ctime())

) sleep(nsec)

print

('loop {} done at {}'

.format

(nloop, ctime())

)def

main()

:print

('starting at:{}'

.format

(ctime())

) threads =

nloops =

range

(len

(loops)

)for i in nloops:

t = threading.thread(target=loop, args=

(i, loops[i]))

for i in nloops:

# 同時啟動執行緒

threads[i]

.start(

)for i in nloops:

threads[i]

.join(

)print

('all done at {}'

.format

(ctime())

)if __name__ ==

'__main__':

main(

)

2.建立thread例項,傳入乙個可呼叫的類例項

import threading

from time import sleep, ctime

loops =[4

,2]class

threadfunc

(object):

def__init__

(self, func, args, name='')

: self.name = name

self.func = func

self.args = args

def__call__

(self)

: self.func(

*self.args)

defloop

(nloop, nsec)

:print

('start loop {} at {}'

.format

(nloop, ctime())

) sleep(nsec)

print

('loop {} done at {}'

.format

(nloop, ctime())

)def

main()

:print

('starting at {}'

.format

(ctime())

) threads =

nloops =

range

(len

(loops)

)for i in nloops:

t = threading.thread(target=threadfunc(loop,

(i, loops[i]

), loop.__name__)

)for i in nloops:

threads[i]

.start(

)for i in nloops:

threads[i]

.join(

)print

('all done at {}'

.format

(ctime())

)if __name__ ==

'__main__'

: main(

)

3.派生thread的子類,並建立子類的例項

import threading

from time import sleep, ctime

loops =[4

,2]class

mythread

(threading.thread)

:def

__init__

(self, func, args, name='')

: threading.thread.__init__(self)

self.name = name

self.func = func

self.args = args

defrun(self)

: self.func(

*self.args)

defloop

(nloop, nsec)

:print

('start loop {} at {}'

.format

(nloop, ctime())

) sleep(nsec)

print

('loop {} done at {}'

.format

(nloop, ctime())

)def

main()

:print

('starting at {}'

.format

(ctime())

) threads =

nloops =

range

(len

(loops)

)for i in nloops:

t = mythread(loop,

(i, loops[i]

), loop.__name__)

for i in nloops:

threads[i]

.start(

)for i in nloops:

threads[i]

.join(

)print

('all done at {}'

.format

(ctime())

)if __name__ ==

'__main__'

: main(

)

acquire()和release()

python執行緒與程序

直接呼叫 import threading,time def run n print running n time.sleep 2 t1 threading.thread target run,args test1 生成乙個執行緒例項 t2 threading.thread target run,a...

python 程序與執行緒

執行緒是作業系統能夠進行運算排程的最小單位,它包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒並行執行不 同的任務。程序 qq要以乙個整體的形式暴露給作業系統功能管理,裡面包含對各種資源的呼叫。記憶體對各種資源管理的集合 就...

Python多執行緒與GIL

gil global interpreter lock 是在實現python解析器 cpython 時所引入的乙個概念。但值得注意的是,gil並不一定是所有python編譯器均必須的,如jpython就沒有gil。gil是python為解決多執行緒之間資料完整性和狀態同步的辦法,類似於在存在乙個全域...