真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

python函數多線程 python中的多線程

python 怎么實現多線程的

線程也就是輕量級的進程,多線程允許一次執(zhí)行多個線程,Python是多線程語言,它有一個多線程包,GIL也就是全局解釋器鎖,以確保一次執(zhí)行單個線程,一個線程保存GIL并在將其傳遞給下一個線程之前執(zhí)行一些操作,也就產生了并行執(zhí)行的錯覺。

創(chuàng)新新互聯,憑借10多年的成都網站制作、成都做網站經驗,本著真心·誠心服務的企業(yè)理念服務于成都中小企業(yè)設計網站有上千案例。做網站建設,選創(chuàng)新互聯。

python之多線程原理

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

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

舉例:開個QQ,開了一個進程,開了微信,開了一個進程。在QQ這個進程里面,傳輸文字開一個線程、傳輸語音開了一個線程、彈出對話框又開了一個線程。

總結:開一個軟件,相當于開了一個進程。在這個軟件運行的過程里,多個工作同時運轉,完成了QQ的運行,那么這個多個工作分別有多個線程。

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

進程在python中的使用,對模塊threading進行操作,調用的這個三方庫??梢酝ㄟ^ help(threading) 了解其中的方法、變量使用情況。也可以使用 dir(threading) 查看目錄結構。

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

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

run_thread_list = threading.enumerate() # 返回當前運行線程的列表

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

t1.setDaemon(True) # 設置守護進程,守護進程:主線程結束時自動退出子線程。

t1.start() # 啟動子線程

t1.join() # 等待進程結束 exit()`# 主線程退出,t1子線程設置了守護進程,會自動退出。其他子線程會繼續(xù)執(zhí)行。

Python多線程總結

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

主要分為三大部分:

共分4部分對多線程的內容進行總結。

先為大家介紹線程的相關概念:

在飛車程序中,如果沒有多線程,我們就不能一邊聽歌一邊玩飛車,聽歌與玩 游戲 不能并行;在使用多線程后,我們就可以在玩 游戲 的同時聽背景音樂。在這個例子中啟動飛車程序就是一個進程,玩 游戲 和聽音樂是兩個線程。

Python 提供了 threading 模塊來實現多線程:

因為新建線程系統(tǒng)需要分配資源、終止線程系統(tǒng)需要回收資源,所以如果可以重用線程,則可以減去新建/終止的開銷以提升性能。同時,使用線程池的語法比自己新建線程執(zhí)行線程更加簡潔。

Python 為我們提供了 ThreadPoolExecutor 來實現線程池,此線程池默認子線程守護。它的適應場景為突發(fā)性大量請求或需要大量線程完成任務,但實際任務處理時間較短。

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

我們把一個時間段內只允許一個線程使用的資源稱為臨界資源,對臨界資源的訪問,必須互斥的進行?;コ猓卜Q間接制約關系。線程互斥指當一個線程訪問某臨界資源時,另一個想要訪問該臨界資源的線程必須等待。當前訪問臨界資源的線程訪問結束,釋放該資源之后,另一個線程才能去訪問臨界資源。鎖的功能就是實現線程互斥。

我把線程互斥比作廁所包間上大號的過程,因為包間里只有一個坑,所以只允許一個人進行大號。當第一個人要上廁所時,會將門上上鎖,這時如果第二個人也想大號,那就必須等第一個人上完,將鎖解開后才能進行,在這期間第二個人就只能在門外等著。這個過程與代碼中使用鎖的原理如出一轍,這里的坑就是臨界資源。 Python 的 threading 模塊引入了鎖。 threading 模塊提供了 Lock 類,它有如下方法加鎖和釋放鎖:

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

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

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

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

python之多線程

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

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

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

1、線程共享內存空間,進程有獨立的內存空間。

2、線程啟動速度快,進程啟動速度慢。注意:二者的運行速度是無法比較的。

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

4、兩個子進程之間數據不共享,完全獨立。同一個進程下的線程共享同一份數據。

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

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

7、同一個進程的線程可以直接交流,兩個進程想要通信,必須通過一個中間代理來實現。

8、對于線程的修改,可能會影響到其他線程的行為。但是對于父進程的修改不會影響到子進程。

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

相比上個程序,這個程序多了一步計算時間,但是我們觀察結果會發(fā)現,程序顯示的執(zhí)行時間只有0.007秒,這是因為最后一個print函數它存在于主線程,而整個程序主線程和所有子線程是并行的,那么可想而知,在子線程還沒有執(zhí)行完畢的時候print函數就已經執(zhí)行了,總的來說,這個時間只是執(zhí)行了一個線程也就是主線程所用的時間。

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

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

這是因為在主線程啟動子線程前把子線程設置為守護線程。

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

主線程退出,守護線程全部強制退出?;实鬯懒耍腿艘哺吃?/p>

應用的場景 : socket-server

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

下面這個程序是一個典型的生產者消費者模型。

生產者消費者模型是經典的在開發(fā)架構中使用的模型

運維中的集群就是生產者消費者模型,生活中很多都是

那么,多線程的使用場景是什么?

python中的多線程實質上是對上下文的不斷切換,可以說是假的多線程。而我們知道,io操作不占用cpu,計算占用cpu,那么python的多線程適合io操作密集的任務,比如socket-server,那么cpu密集型的任務,python怎么處理?python可以折中的利用計算機的多核:啟動八個進程,每個進程有一個線程。這樣就可以利用多進程解決多核問題。


文章題目:python函數多線程 python中的多線程
URL分享:http://weahome.cn/article/dojicgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部