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

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

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

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

簡(jiǎn)單的多線程

import threading, time

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

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

time.sleep(6)
#多線程啟動(dòng)數(shù)量比較多時(shí)可以使用for循環(huán),多線程并行執(zhí)行,打印的結(jié)果有可能不是按照啟動(dòng)順序來(lái)打印的
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í)行接下來(lái)的主線程的東西
start_time1 = time.time()
tl = [] #將多線程的對(duì)象存起來(lái),用于后面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í)行時(shí)間大約就是5s
#如果多個(gè)子線程一些join一些沒(méi)有join主線程怎么處理???部分子線程join主線程會(huì)等join時(shí)間最長(zhǎng)的子線程結(jié)束后才繼續(xù),未參與join的子線程仍然和主線程并行運(yùn)行
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)) #實(shí)際耗時(shí)15s

守護(hù)線程 setDeamon

#守護(hù)進(jìn)程,即主線程結(jié)束以后所有的其它線程也立即結(jié)束,不用等其它線程執(zhí)行完畢;正常情況即使沒(méi)加join主線程執(zhí)行完畢當(dāng)其它線程未執(zhí)行完畢程序也不會(huì)退出,必須等待所有線程執(zhí)行完畢程序才結(jié)束,類(lèi)似主程序在末尾有默認(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") #整個(gè)程序結(jié)束,不會(huì)等待守護(hù)線程打印操作執(zhí)行完畢就直接結(jié)束了

遞歸鎖 Rlock

#遞歸鎖,一個(gè)鎖里面嵌套著鎖,如果不使用遞歸鎖會(huì)導(dǎo)致釋放鎖邏輯錯(cuò)誤,整個(gè)程序就跑偏了;使用遞歸鎖后程序會(huì)維護(hù)一個(gè)加鎖 解鎖的數(shù)據(jù)結(jié)構(gòu),保證釋放鎖不會(huì)出問(wèn)題
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()) #整個(gè)程序一直在打印有兩個(gè)線程,非主線程的鎖嵌套出問(wèn)題導(dǎo)致無(wú)法退出,整個(gè)程序卡死
  time.sleep(1)

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Python實(shí)現(xiàn)對(duì)adb命令封裝

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

    python列表,字典,元組簡(jiǎn)單用法示例

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

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

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

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

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

    淺談django orm 優(yōu)化

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

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

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

最新評(píng)論

富阳市| 乳山市| 武城县| 政和县| 改则县| 竹北市| 若尔盖县| 宁武县| 桂林市| 祥云县| 隆回县| 麟游县| 普格县| 通化市| 延长县| 乌兰浩特市| 高清| 西畴县| 栖霞市| 岫岩| 江津市| 咸丰县| 普格县| 腾冲县| 凤台县| 南溪县| 康平县| 宣城市| 壶关县| 泉州市| 石阡县| 凤城市| 正镶白旗| 嵩明县| 瓮安县| 固镇县| 利津县| 盐城市| 天峻县| 富源县| 安达市|