1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      python多線程函數(shù) python多線程函數(shù)返回值

      python之多線程原理

      并發(fā):邏輯上具備同時(shí)處理多個(gè)任務(wù)的能力。

      創(chuàng)新互聯(lián)是專業(yè)的吉陽(yáng)網(wǎng)站建設(shè)公司,吉陽(yáng)接單;提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行吉陽(yáng)網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

      并行:物理上在同一時(shí)刻執(zhí)行多個(gè)并發(fā)任務(wù)。

      舉例:開(kāi)個(gè)QQ,開(kāi)了一個(gè)進(jìn)程,開(kāi)了微信,開(kāi)了一個(gè)進(jìn)程。在QQ這個(gè)進(jìn)程里面,傳輸文字開(kāi)一個(gè)線程、傳輸語(yǔ)音開(kāi)了一個(gè)線程、彈出對(duì)話框又開(kāi)了一個(gè)線程。

      總結(jié):開(kāi)一個(gè)軟件,相當(dāng)于開(kāi)了一個(gè)進(jìn)程。在這個(gè)軟件運(yùn)行的過(guò)程里,多個(gè)工作同時(shí)運(yùn)轉(zhuǎn),完成了QQ的運(yùn)行,那么這個(gè)多個(gè)工作分別有多個(gè)線程。

      線程和進(jìn)程之間的區(qū)別:

      進(jìn)程在python中的使用,對(duì)模塊threading進(jìn)行操作,調(diào)用的這個(gè)三方庫(kù)。可以通過(guò) help(threading) 了解其中的方法、變量使用情況。也可以使用 dir(threading) 查看目錄結(jié)構(gòu)。

      current_thread_num = threading.active_count() # 返回正在運(yùn)行的線程數(shù)量

      run_thread_len = len(threading.enumerate()) # 返回正在運(yùn)行的線程數(shù)量

      run_thread_list = threading.enumerate() # 返回當(dāng)前運(yùn)行線程的列表

      t1=threading.Thread(target=dance) #創(chuàng)建兩個(gè)子線程,參數(shù)傳遞為函數(shù)名

      t1.setDaemon(True) # 設(shè)置守護(hù)進(jìn)程,守護(hù)進(jìn)程:主線程結(jié)束時(shí)自動(dòng)退出子線程。

      t1.start() # 啟動(dòng)子線程

      t1.join() # 等待進(jìn)程結(jié)束 exit()`# 主線程退出,t1子線程設(shè)置了守護(hù)進(jìn)程,會(huì)自動(dòng)退出。其他子線程會(huì)繼續(xù)執(zhí)行。

      python多線程怎樣執(zhí)行函數(shù)

      將你需要多線程并發(fā)執(zhí)行的函數(shù)放入list中

      import threading

      threads = []

      t1 = threading.Thread(target=函數(shù)名,args=參數(shù))

      threads.append(t1)

      啟動(dòng)多線程

      if __name__ == '__main__':

      ??? for t in threads:

      ? ? ??? t.setDaemon(True)

      ? ? ??? t.start()

      t.join()

      更多詳細(xì)操作help(threading)

      #coding=utf-8

      import?threading

      from?time?import?ctime,sleep

      #?要啟動(dòng)的函數(shù)

      def?music(func):

      for?i?in?range(2):

      print?"I?was?listening?to?%s.?%s"?%(func,ctime())

      sleep(1)

      #?要啟動(dòng)的函數(shù)

      def?move(func):

      for?i?in?range(2):

      print?"I?was?at?the?%s!?%s"?%(func,ctime())

      sleep(5)

      threads?=?[]

      t1?=?threading.Thread(target=music,args=(u'愛(ài)情買賣',))

      threads.append(t1)

      t2?=?threading.Thread(target=move,args=(u'阿凡達(dá)',))

      threads.append(t2)

      #?函數(shù)加入線程列表

      if?__name__?==?'__main__':

      for?t?in?threads:

      t.setDaemon(True)

      t.start()

      t.join()?#子線程完成運(yùn)行之前,這個(gè)子線程的父線程將一直被阻塞,不會(huì)退出

      print?"all?over?%s"?%ctime()

      python之多線程

      進(jìn)程的概念:以一個(gè)整體的形式暴露給操作系統(tǒng)管理,里面包含各種資源的調(diào)用。 對(duì)各種資源管理的集合就可以稱為進(jìn)程。

      線程的概念:是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。本質(zhì)上就是一串指令的集合。

      進(jìn)程和線程的區(qū)別:

      1、線程共享內(nèi)存空間,進(jìn)程有獨(dú)立的內(nèi)存空間。

      2、線程啟動(dòng)速度快,進(jìn)程啟動(dòng)速度慢。注意:二者的運(yùn)行速度是無(wú)法比較的。

      3、線程是執(zhí)行的指令集,進(jìn)程是資源的集合

      4、兩個(gè)子進(jìn)程之間數(shù)據(jù)不共享,完全獨(dú)立。同一個(gè)進(jìn)程下的線程共享同一份數(shù)據(jù)。

      5、創(chuàng)建新的線程很簡(jiǎn)單,創(chuàng)建新的進(jìn)程需要對(duì)他的父進(jìn)程進(jìn)行一次克隆。

      6、一個(gè)線程可以操作(控制)同一進(jìn)程里的其他線程,但是進(jìn)程只能操作子進(jìn)程

      7、同一個(gè)進(jìn)程的線程可以直接交流,兩個(gè)進(jìn)程想要通信,必須通過(guò)一個(gè)中間代理來(lái)實(shí)現(xiàn)。

      8、對(duì)于線程的修改,可能會(huì)影響到其他線程的行為。但是對(duì)于父進(jìn)程的修改不會(huì)影響到子進(jìn)程。

      第一個(gè)程序,使用循環(huán)來(lái)創(chuàng)建線程,但是這個(gè)程序中一共有51個(gè)線程,我們創(chuàng)建了50個(gè)線程,但是還有一個(gè)程序本身的線程,是主線程。這51個(gè)線程是并行的。注意:這個(gè)程序中是主線程啟動(dòng)了子線程。

      相比上個(gè)程序,這個(gè)程序多了一步計(jì)算時(shí)間,但是我們觀察結(jié)果會(huì)發(fā)現(xiàn),程序顯示的執(zhí)行時(shí)間只有0.007秒,這是因?yàn)樽詈笠粋€(gè)print函數(shù)它存在于主線程,而整個(gè)程序主線程和所有子線程是并行的,那么可想而知,在子線程還沒(méi)有執(zhí)行完畢的時(shí)候print函數(shù)就已經(jīng)執(zhí)行了,總的來(lái)說(shuō),這個(gè)時(shí)間只是執(zhí)行了一個(gè)線程也就是主線程所用的時(shí)間。

      接下來(lái)這個(gè)程序,吸取了上面這個(gè)程序的缺點(diǎn),創(chuàng)建了一個(gè)列表,把所有的線程實(shí)例都存進(jìn)去,然后使用一個(gè)for循環(huán)依次對(duì)線程實(shí)例調(diào)用join方法,這樣就可以使得主線程等待所創(chuàng)建的所有子線程執(zhí)行完畢才能往下走。 注意實(shí)驗(yàn)結(jié)果:和兩個(gè)線程的結(jié)果都是兩秒多一點(diǎn)

      注意觀察實(shí)驗(yàn)結(jié)果,并沒(méi)有執(zhí)行打印task has done,并且程序執(zhí)行時(shí)間極其短。

      這是因?yàn)樵谥骶€程啟動(dòng)子線程前把子線程設(shè)置為守護(hù)線程。

      只要主線程執(zhí)行完畢,不管子線程是否執(zhí)行完畢,就結(jié)束。但是會(huì)等待非守護(hù)線程執(zhí)行完畢

      主線程退出,守護(hù)線程全部強(qiáng)制退出。皇帝死了,仆人也跟著殉葬

      應(yīng)用的場(chǎng)景 : socket-server

      注意:gil只是為了減低程序開(kāi)發(fā)復(fù)雜度。但是在2.幾的版本上,需要加用戶態(tài)的鎖(gil的缺陷)而在3點(diǎn)幾的版本上,加鎖不加鎖都一樣。

      下面這個(gè)程序是一個(gè)典型的生產(chǎn)者消費(fèi)者模型。

      生產(chǎn)者消費(fèi)者模型是經(jīng)典的在開(kāi)發(fā)架構(gòu)中使用的模型

      運(yùn)維中的集群就是生產(chǎn)者消費(fèi)者模型,生活中很多都是

      那么,多線程的使用場(chǎng)景是什么?

      python中的多線程實(shí)質(zhì)上是對(duì)上下文的不斷切換,可以說(shuō)是假的多線程。而我們知道,io操作不占用cpu,計(jì)算占用cpu,那么python的多線程適合io操作密集的任務(wù),比如socket-server,那么cpu密集型的任務(wù),python怎么處理?python可以折中的利用計(jì)算機(jī)的多核:?jiǎn)?dòng)八個(gè)進(jìn)程,每個(gè)進(jìn)程有一個(gè)線程。這樣就可以利用多進(jìn)程解決多核問(wèn)題。

      Python多線程總結(jié)

      在實(shí)際處理數(shù)據(jù)時(shí),因系統(tǒng)內(nèi)存有限,我們不可能一次把所有數(shù)據(jù)都導(dǎo)出進(jìn)行操作,所以需要批量導(dǎo)出依次操作。為了加快運(yùn)行,我們會(huì)采用多線程的方法進(jìn)行數(shù)據(jù)處理, 以下為我總結(jié)的多線程批量處理數(shù)據(jù)的模板:

      主要分為三大部分:

      共分4部分對(duì)多線程的內(nèi)容進(jìn)行總結(jié)。

      先為大家介紹線程的相關(guān)概念:

      在飛車程序中,如果沒(méi)有多線程,我們就不能一邊聽(tīng)歌一邊玩飛車,聽(tīng)歌與玩 游戲 不能并行;在使用多線程后,我們就可以在玩 游戲 的同時(shí)聽(tīng)背景音樂(lè)。在這個(gè)例子中啟動(dòng)飛車程序就是一個(gè)進(jìn)程,玩 游戲 和聽(tīng)音樂(lè)是兩個(gè)線程。

      Python 提供了 threading 模塊來(lái)實(shí)現(xiàn)多線程:

      因?yàn)樾陆ň€程系統(tǒng)需要分配資源、終止線程系統(tǒng)需要回收資源,所以如果可以重用線程,則可以減去新建/終止的開(kāi)銷以提升性能。同時(shí),使用線程池的語(yǔ)法比自己新建線程執(zhí)行線程更加簡(jiǎn)潔。

      Python 為我們提供了 ThreadPoolExecutor 來(lái)實(shí)現(xiàn)線程池,此線程池默認(rèn)子線程守護(hù)。它的適應(yīng)場(chǎng)景為突發(fā)性大量請(qǐng)求或需要大量線程完成任務(wù),但實(shí)際任務(wù)處理時(shí)間較短。

      其中 max_workers 為線程池中的線程個(gè)數(shù),常用的遍歷方法有 map 和 submit+as_completed 。根據(jù)業(yè)務(wù)場(chǎng)景的不同,若我們需要輸出結(jié)果按遍歷順序返回,我們就用 map 方法,若想誰(shuí)先完成就返回誰(shuí),我們就用 submit+as_complete 方法。

      我們把一個(gè)時(shí)間段內(nèi)只允許一個(gè)線程使用的資源稱為臨界資源,對(duì)臨界資源的訪問(wèn),必須互斥的進(jìn)行。互斥,也稱間接制約關(guān)系。線程互斥指當(dāng)一個(gè)線程訪問(wèn)某臨界資源時(shí),另一個(gè)想要訪問(wèn)該臨界資源的線程必須等待。當(dāng)前訪問(wèn)臨界資源的線程訪問(wèn)結(jié)束,釋放該資源之后,另一個(gè)線程才能去訪問(wèn)臨界資源。鎖的功能就是實(shí)現(xiàn)線程互斥。

      我把線程互斥比作廁所包間上大號(hào)的過(guò)程,因?yàn)榘g里只有一個(gè)坑,所以只允許一個(gè)人進(jìn)行大號(hào)。當(dāng)?shù)谝粋€(gè)人要上廁所時(shí),會(huì)將門上上鎖,這時(shí)如果第二個(gè)人也想大號(hào),那就必須等第一個(gè)人上完,將鎖解開(kāi)后才能進(jìn)行,在這期間第二個(gè)人就只能在門外等著。這個(gè)過(guò)程與代碼中使用鎖的原理如出一轍,這里的坑就是臨界資源。 Python 的 threading 模塊引入了鎖。 threading 模塊提供了 Lock 類,它有如下方法加鎖和釋放鎖:

      我們會(huì)發(fā)現(xiàn)這個(gè)程序只會(huì)打印“第一道鎖”,而且程序既沒(méi)有終止,也沒(méi)有繼續(xù)運(yùn)行。這是因?yàn)? Lock 鎖在同一線程內(nèi)第一次加鎖之后還沒(méi)有釋放時(shí),就進(jìn)行了第二次 acquire 請(qǐng)求,導(dǎo)致無(wú)法執(zhí)行 release ,所以鎖永遠(yuǎn)無(wú)法釋放,這就是死鎖。如果我們使用 RLock 就能正常運(yùn)行,不會(huì)發(fā)生死鎖的狀態(tài)。

      在主線程中定義 Lock 鎖,然后上鎖,再創(chuàng)建一個(gè)子 線程t 運(yùn)行 main 函數(shù)釋放鎖,結(jié)果正常輸出,說(shuō)明主線程上的鎖,可由子線程解鎖。

      如果把上面的鎖改為 RLock 則報(bào)錯(cuò)。在實(shí)際中設(shè)計(jì)程序時(shí),我們會(huì)將每個(gè)功能分別封裝成一個(gè)函數(shù),每個(gè)函數(shù)中都可能會(huì)有臨界區(qū)域,所以就需要用到 RLock 。

      一句話總結(jié)就是 Lock 不能套娃, RLock 可以套娃; Lock 可以由其他線程中的鎖進(jìn)行操作, RLock 只能由本線程進(jìn)行操作。


      名稱欄目:python多線程函數(shù) python多線程函數(shù)返回值
      本文來(lái)源:http://www.ef60e0e.cn/article/hjcdog.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        侯马市| 安丘市| 会同县| 巴塘县| 徐水县| 高安市| 赤壁市| 阿拉善盟| 卓资县| 邵东县| 阿拉尔市| 哈巴河县| 和林格尔县| 祁东县| 邢台县| 浪卡子县| 高平市| 广汉市| 拜城县| 清丰县| 松江区| 临安市| 莱西市| 保亭| 通州区| 秀山| 乐业县| 顺昌县| 海口市| 崇阳县| 陵川县| 高安市| 方山县| 仙桃市| 黔东| 沧州市| 南昌市| 南平市| 云龙县| 绵阳市| 汤原县|