最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多線程threading join和守護(hù)線程setDeamon原理詳解

 更新時間:2020年03月18日 10:21:20   作者:flag_HW  
這篇文章主要介紹了Python多線程threading join和守護(hù)線程setDeamon原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

同一進(jìn)程下的多個線程共享內(nèi)存數(shù)據(jù),多個線程之間沒有主次關(guān)系,相互之間可以操作;cpu執(zhí)行的都是線程,默認(rèn)程序會開一個主線程;進(jìn)程是程序以及和程序相關(guān)資源的集合;某些場景下我們可以使用多線程來達(dá)到提高程序執(zhí)行效率的目的,下面就多線程的一些基礎(chǔ)知識做簡要說明

簡單的多線程

import threading, time

def test1(x):
  time.sleep(5)
  print(x**x)

#下面定義兩個線程調(diào)用test1這個函數(shù),創(chuàng)建多線程使用如下語法,target后面跟函數(shù)名,args傳遞實參,實參需要以元組形式傳遞
start_time = time.time()
t1 = threading.Thread(target=test1, args=(5,))
t2 = threading.Thread(target=test1, args=(6,))
#啟動多線程
t1.start()
t2.start()
end_time = time.time()
total_time = end_time - start_time
print("two Thread used %s time"%total_time) #由于使用多線程,t1 t2啟動以后并不會等待期執(zhí)行完程序才繼續(xù)往后走,因為主程序就是主線程和t1 t2是并行執(zhí)行的,主程序執(zhí)行到此t1 t2并未運行完成

time.sleep(6)
#多線程啟動數(shù)量比較多時可以使用for循環(huán),多線程并行執(zhí)行,打印的結(jié)果有可能不是按照啟動順序來打印的
for i in range(5):
  t3 = threading.Thread(target=test1, args=(i,))
  t3.start()
time.sleep(6)

主線程等待非主線程執(zhí)行完畢才繼續(xù)執(zhí)行 join方法

#有些情況主線程需要子線程執(zhí)行完畢后,有可能是將數(shù)據(jù)處理完畢后才執(zhí)行接下來的主線程的東西
start_time1 = time.time()
tl = [] #將多線程的對象存起來,用于后面join方法
for i in range(5):
  t4 = threading.Thread(target=test1, args=(i,))
  t4.start()
  tl.append(t4)
for t in tl: #將多線程并發(fā)join,參加join的子線程執(zhí)行完畢后才繼續(xù)執(zhí)行下面的主線程。
  t.join()
end_time1 = time.time()
total_time1 = end_time1 - start_time1
print(total_time1) #此次執(zhí)行時間大約就是5s
#如果多個子線程一些join一些沒有join主線程怎么處理???部分子線程join主線程會等join時間最長的子線程結(jié)束后才繼續(xù),未參與join的子線程仍然和主線程并行運行
t5 = threading.Thread(target=test1, args=(5,))
t6 = threading.Thread(target=test1, args=(6,))
t5.start()
t6.start()
t5_join_start_time = time.time()
t5.join()
time.sleep(10)
t5_join_end_time = time.time()
print("t5 join time is %s"%(t5_join_end_time - t5_join_start_time)) #實際耗時15s

守護(hù)線程 setDeamon

#守護(hù)進(jìn)程,即主線程結(jié)束以后所有的其它線程也立即結(jié)束,不用等其它線程執(zhí)行完畢;正常情況即使沒加join主線程執(zhí)行完畢當(dāng)其它線程未執(zhí)行完畢程序也不會退出,必須等待所有線程執(zhí)行完畢程序才結(jié)束,類似主程序在末尾有默認(rèn)的join
def test1(x):
  time.sleep(5)
  print("i an other Thread",x**x)

for i in range(5):
  t = threading.Thread(target=test1, args=(i,))
  t.setDaemon(True)
  t.start()

print("Main Thread is done") #整個程序結(jié)束,不會等待守護(hù)線程打印操作執(zhí)行完畢就直接結(jié)束了

遞歸鎖 Rlock

#遞歸鎖,一個鎖里面嵌套著鎖,如果不使用遞歸鎖會導(dǎo)致釋放鎖邏輯錯誤,整個程序就跑偏了;使用遞歸鎖后程序會維護(hù)一個加鎖 解鎖的數(shù)據(jù)結(jié)構(gòu),保證釋放鎖不會出問題
lock = threading.Lock()
def test2():
  lock.acquire()
  print("this is test2")
  lock.release()

def test3():
  lock.acquire()
  print("this is test3")
  lock.release()

def test4():
  lock.acquire()
  test2()
  print("this is test4")
  test3()
  lock.release()

rlock_test = threading.Thread(target=test4)
rlock_test.start()

while threading.active_count() != 1:
  print("current thread count is",threading.active_count()) #整個程序一直在打印有兩個線程,非主線程的鎖嵌套出問題導(dǎo)致無法退出,整個程序卡死
  time.sleep(1)

將lock = threading.Lock()修改為lock = threading.RLock()整個程序就能正常結(jié)束;正常結(jié)束的輸出如下

this is test2
this is test4
current thread count is 2
this is test3

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python使用Selenium模塊實現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能示例

    Python使用Selenium模塊實現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能示例

    這篇文章主要介紹了Python使用Selenium模塊實現(xiàn)模擬瀏覽器抓取淘寶商品美食信息功能,涉及Python基于re模塊的正則匹配及selenium模塊的頁面抓取等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • PyCharm刷新項目(文件)目錄的實現(xiàn)

    PyCharm刷新項目(文件)目錄的實現(xiàn)

    今天小編就為大家分享一篇PyCharm刷新項目(文件)目錄的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python腳本激活Linux密碼的方法(crypt模塊)

    Python腳本激活Linux密碼的方法(crypt模塊)

    今天小編給大家分享一個非常不錯的方法破解linux口令,主要是利用linux系統(tǒng)中的crypt模塊模擬了linux系統(tǒng)中用戶密碼的加密,操作也很方便,對python破解linux口令相關(guān)知識感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • Python蓄水池算法的應(yīng)用案例與代碼詳解

    Python蓄水池算法的應(yīng)用案例與代碼詳解

    蓄水池算法(Reservoir Sampling)是一種用于處理大規(guī)模數(shù)據(jù)流的隨機(jī)抽樣算法,該算法能夠在不知道數(shù)據(jù)流大小的情況下,從數(shù)據(jù)流中均勻隨機(jī)地抽取固定大小的樣本,本文給大家介紹了一個詳細(xì)的Python蓄水池算法的實現(xiàn),包括完整的代碼示例,需要的朋友可以參考下
    2024-11-11
  • Python實現(xiàn)對adb命令封裝

    Python實現(xiàn)對adb命令封裝

    這篇文章主要介紹了Python實現(xiàn)對adb命令封裝,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python列表,字典,元組簡單用法示例

    python列表,字典,元組簡單用法示例

    這篇文章主要介紹了python列表,字典,元組簡單用法,結(jié)合實例形式分析了Python列表,字典,元組的功能及相關(guān)函數(shù)使用技巧,需要的朋友可以參考下
    2019-07-07
  • 通過Python的gtts庫將文字轉(zhuǎn)為音頻的操作方法

    通過Python的gtts庫將文字轉(zhuǎn)為音頻的操作方法

    文字轉(zhuǎn)音頻可以幫助視覺障礙者通過聽取聲音來獲取信息,也可以幫助人們方便地聽取一些長篇文章或?qū)W習(xí)資料,節(jié)省閱讀時間和疲勞,這篇文章主要介紹了通過Python的gtts庫將文字轉(zhuǎn)為音頻的方法,需要的朋友可以參考下
    2023-05-05
  • Python?copy()與deepcopy()方法之間有什么區(qū)別

    Python?copy()與deepcopy()方法之間有什么區(qū)別

    這篇文章主要介紹了Python中的copy()和deepcopy(),下面詳細(xì)介紹該內(nèi)容并附上詳細(xì)代碼,需要的朋友可以參考一下文章的具體內(nèi)容,希望對你有所幫助
    2022-10-10
  • 淺談django orm 優(yōu)化

    淺談django orm 優(yōu)化

    這篇文章主要介紹了淺談django orm 優(yōu)化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Python使用Pandas處理測試數(shù)據(jù)的方法

    Python使用Pandas處理測試數(shù)據(jù)的方法

    Pandas是一個功能極其強(qiáng)大的數(shù)據(jù)分析庫,可以高效地操作各種數(shù)據(jù)集,這篇文章主要介紹了Python自動化測試-使用Pandas來高效處理測試數(shù)據(jù),需要的朋友可以參考下
    2023-02-02

最新評論

九江县| 荥阳市| 永宁县| 通海县| 东乌珠穆沁旗| 克山县| 肥城市| 尼勒克县| 含山县| 罗源县| 洪湖市| 五台县| 日喀则市| 漾濞| 镇原县| 保亭| 海丰县| 淳安县| 敖汉旗| 谢通门县| 比如县| 凭祥市| 准格尔旗| 凤凰县| 华坪县| 淮滨县| 灵山县| 融水| 绥棱县| 北京市| 罗城| 保定市| 云霄县| 潞城市| 永川市| 怀宁县| 蓬溪县| 金昌市| 奎屯市| 张家港市| 蕉岭县|