Python?threading中l(wèi)ock的使用詳解
在多線(xiàn)程中使用lock可以讓多個(gè)線(xiàn)程在共享資源的時(shí)候不會(huì)“亂”,例如,創(chuàng)建多個(gè)線(xiàn)程,每個(gè)線(xiàn)程都往空列表l中添加一個(gè)數(shù)字并打印當(dāng)前的列表l,如果不加鎖,就可能會(huì)這樣:
# encoding=utf8 import threading import time lock = threading.Lock() l = [] def test1(n): lock.acquire() l.append(n) print l lock.release() def test(n): l.append(n) print l def main(): for i in xrange(0, 10): th = threading.Thread(target=test, args=(i, )) th.start() if __name__ == '__main__': main()
運(yùn)行結(jié)果:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3][
0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4[, 05, , 16, , 27, ]3
, 4, 5, 6[, 07, , 18, ]2
, 3, 4, [50, , 61, , 72, , 83, , 94],
5, 6, 7, 8, 9]
因?yàn)槊總€(gè)線(xiàn)程都在同時(shí)往l中添加一個(gè)數(shù)字(當(dāng)前每個(gè)線(xiàn)程運(yùn)行的是test函數(shù)),然后又可能在同時(shí)打印l,所以最后的結(jié)果看起來(lái)會(huì)有些“混亂”。
下面讓每個(gè)線(xiàn)程調(diào)用“test1”函數(shù),看看結(jié)果如何:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
現(xiàn)在看起來(lái)就好多了,因?yàn)閠est1中每次像l中添加數(shù)字并打印之前,都先加了一把“鎖”,這樣就可以保證每次只有一個(gè)線(xiàn)程可以往l中添加數(shù)字,而不是同時(shí)往l里添加數(shù)字。
通過(guò)上面的結(jié)果比較可以知道,當(dāng)多線(xiàn)程中需要“獨(dú)占資源”的時(shí)候,要使用鎖來(lái)控制,防止多個(gè)線(xiàn)程同時(shí)占用資源而出現(xiàn)其他異常。
使用鎖的時(shí)候就調(diào)用acquire()方法,以此告訴其他線(xiàn)程,我正在占用該資源,你們要等會(huì);待使用資源后需要釋放資源的時(shí)候就調(diào)用release()方法,告訴其他線(xiàn)程,我已經(jīng)完成使用該資源了,其他人可以過(guò)來(lái)使用了。
python threading Lock
這篇文章主要是通過(guò)代碼說(shuō)明:
threading.Lock()不影響multiprocessing- .
threading.Lock()影響threading.
代碼如下:
import threading
import time
from multiprocessing import Pool
_lock = threading.Lock()
def small_func(value):
"""
添加線(xiàn)程鎖
:param value:
:return:
"""
print(value)
with _lock:
time.sleep(5)
return value
def no_small_func(value):
"""
沒(méi)有線(xiàn)程鎖
:param value:
:return:
"""
print(value)
# with _lock:
time.sleep(5)
return value
def main():
"""
multiprocessing 是基于進(jìn)程的,因此線(xiàn)程鎖對(duì)其不影響,
:return:
"""
st = time.time()
p = Pool(processes=4)
value = p.map(func=small_func, iterable=range(4))
et = time.time()
print(f"all use time: {et - st}")
print(value)
def main2():
"""
threading 受到 線(xiàn)程鎖 影響
:return:
"""
st = time.time()
thread_list = []
for temp_value in range(4):
t = threading.Thread(target=small_func, args=(temp_value,))
t.start()
thread_list.append(t)
for i in thread_list:
i.join()
et = time.time()
print(f"all use time: {et - st}")
# print(value)
def main3():
st = time.time()
thread_list = []
res = []
for temp_value in range(4):
# 不加線(xiàn)程鎖就行了
t = threading.Thread(target=no_small_func, args=(temp_value,))
t.start()
thread_list.append(t)
for i in thread_list:
v = i.join()
res.append(v)
et = time.time()
print(f"all use time: {et - st}")
print(res)
if __name__ == '__main__':
# main()
# main2()
main3()到此這篇關(guān)于Python threading中l(wèi)ock的使用的文章就介紹到這了,更多相關(guān)Python threading lock使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Mac OS上搭建Python的開(kāi)發(fā)環(huán)境
這篇文章主要介紹了在Mac OS上搭建Apache服務(wù)器和Python解釋器的開(kāi)發(fā)環(huán)境,雖然Mac OS上自帶Python但往往難以滿(mǎn)足開(kāi)發(fā)者對(duì)版本的需求,需要的朋友可以參考下2015-12-12
Python基于Google?Bard實(shí)現(xiàn)交互式聊天機(jī)器人
這篇文章主要為大家介紹了Python基于Google?Bard實(shí)現(xiàn)交互式聊天機(jī)器人示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
python文件讀寫(xiě)并使用mysql批量插入示例分享(python操作mysql)
這篇文章主要介紹了python文件讀寫(xiě)并使用mysql批量插入示例,可以學(xué)習(xí)到python操作mysql數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2014-02-02
Python爬蟲(chóng)Scrapy框架CrawlSpider原理及使用案例
這篇文章主要介紹了Python爬蟲(chóng)Scrapy框架(CrawlSpider),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
解決Python中定時(shí)任務(wù)線(xiàn)程無(wú)法自動(dòng)退出的問(wèn)題
今天小編就為大家分享一篇解決Python中定時(shí)任務(wù)線(xiàn)程無(wú)法自動(dòng)退出的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
在matlab中創(chuàng)建類(lèi)似字典的數(shù)據(jù)結(jié)構(gòu)方式
這篇文章主要介紹了在matlab中創(chuàng)建類(lèi)似字典的數(shù)據(jù)結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

