同步概念:協同步調,按預定的先後次序執行
併發:不同時執行(執行緒)
並行:同時執行(程序)
同步原語: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為解決多執行緒之間資料完整性和狀態同步的辦法,類似於在存在乙個全域...