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

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

Python函數式多線程的簡單介紹

Python多線程總結

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

成都創(chuàng)新互聯(lián)是一家專業(yè)提供鶴城企業(yè)網站建設,專注與網站建設、網站設計、H5頁面制作、小程序制作等業(yè)務。10年已為鶴城眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網站制作公司優(yōu)惠進行中。

主要分為三大部分:

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

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

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

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

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

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

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

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

我把線程互斥比作廁所包間上大號的過程,因為包間里只有一個坑,所以只允許一個人進行大號。當第一個人要上廁所時,會將門上上鎖,這時如果第二個人也想大號,那就必須等第一個人上完,將鎖解開后才能進行,在這期間第二個人就只能在門外等著。這個過程與代碼中使用鎖的原理如出一轍,這里的坑就是臨界資源。 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í)行完畢

主線程退出,守護線程全部強制退出?;实鬯懒?,仆人也跟著殉葬

應用的場景 : socket-server

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

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

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

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

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

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

python 怎么實現多線程的

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

python多線程的幾種方法

Python進階(二十六)-多線程實現同步的四種方式

臨界資源即那些一次只能被一個線程訪問的資源,典型例子就是打印機,它一次只能被一個程序用來執(zhí)行打印功能,因為不能多個線程同時操作,而訪問這部分資源的代碼通常稱之為臨界區(qū)。

鎖機制

threading的Lock類,用該類的acquire函數進行加鎖,用realease函數進行解鎖

import threadingimport timeclass Num:

def __init__(self):

self.num = 0

self.lock = threading.Lock() def add(self):

self.lock.acquire()#加鎖,鎖住相應的資源

self.num += 1

num = self.num

self.lock.release()#解鎖,離開該資源

return num

n = Num()class jdThread(threading.Thread):

def __init__(self,item):

threading.Thread.__init__(self)

self.item = item def run(self):

time.sleep(2)

value = n.add()#將num加1,并輸出原來的數據和+1之后的數據

print(self.item,value)for item in range(5):

t = jdThread(item)

t.start()

t.join()#使線程一個一個執(zhí)行12345678910111213141516171819202122232425262728

當一個線程調用鎖的acquire()方法獲得鎖時,鎖就進入“l(fā)ocked”狀態(tài)。每次只有一個線程可以獲得鎖。如果此時另一個線程試圖獲得這個鎖,該線程就會變?yōu)椤癰locked”狀態(tài),稱為“同步阻塞”(參見多線程的基本概念)。

直到擁有鎖的線程調用鎖的release()方法釋放鎖之后,鎖進入“unlocked”狀態(tài)。線程調度程序從處于同步阻塞狀態(tài)的線程中選擇一個來獲得鎖,并使得該線程進入運行(running)狀態(tài)。

信號量

信號量也提供acquire方法和release方法,每當調用acquire方法的時候,如果內部計數器大于0,則將其減1,如果內部計數器等于0,則會阻塞該線程,知道有線程調用了release方法將內部計數器更新到大于1位置。

import threadingimport timeclass Num:

def __init__(self):

self.num = 0

self.sem = threading.Semaphore(value = 3) #允許最多三個線程同時訪問資源

def add(self):

self.sem.acquire()#內部計數器減1

self.num += 1

num = self.num

self.sem.release()#內部計數器加1

return num

n = Num()class jdThread(threading.Thread):

def __init__(self,item):

threading.Thread.__init__(self)

self.item = item def run(self):

time.sleep(2)

value = n.add()

print(self.item,value)for item in range(100):

Python多線程是什么意思?

多線程能讓你像運行一個獨立的程序一樣運行一段長代碼。這有點像調用子進程(subprocess),不過區(qū)別是你調用shu的是一個函數或者一個類,而不是獨立的程序。

程基本上是一個獨立執(zhí)行流程。單個進程可以由多個線程組成。程序中的每個線程都執(zhí)行特定的任務。例如,當你在電腦上玩游戲時,比如說國際足聯(lián),整個游戲是一個單一的過程。,但它由幾個線程組成,負責播放音樂、接收用戶的輸入、同步運行對手等。所有這些都是單獨的線程,負責在同一個程序中執(zhí)行這些不同的任務。

每個進程都有一個始終在運行的線程。這是主線。這個主線程實際上創(chuàng)建子線程對象。子線程也由主線程啟動。


分享名稱:Python函數式多線程的簡單介紹
網頁URL:http://weahome.cn/article/hgpiho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部