欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python函數(shù)多線程,python 多線程 函數(shù)

python 怎么實(shí)現(xiàn)多線程的

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

創(chuàng)新互聯(lián)建站主要為客戶提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)視覺設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式網(wǎng)站建設(shè)公司移動(dòng)網(wǎng)站建設(shè)、微商城、網(wǎng)站托管及網(wǎng)站維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊(cè)、國(guó)內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測(cè)試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為iso認(rèn)證行業(yè)客戶提供了網(wǎng)站開發(fā)服務(wù)。

python多線程幾種方法實(shí)現(xiàn)

Python進(jìn)階(二十六)-多線程實(shí)現(xiàn)同步的四種方式

臨界資源即那些一次只能被一個(gè)線程訪問的資源,典型例子就是打印機(jī),它一次只能被一個(gè)程序用來執(zhí)行打印功能,因?yàn)椴荒芏鄠€(gè)線程同時(shí)操作,而訪問這部分資源的代碼通常稱之為臨界區(qū)。

鎖機(jī)制

threading的Lock類,用該類的acquire函數(shù)進(jìn)行加鎖,用realease函數(shù)進(jìn)行解鎖

import threadingimport timeclass Num:

def __init__(self):

self.num = 0

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

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

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,并輸出原來的數(shù)據(jù)和+1之后的數(shù)據(jù)

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

t = jdThread(item)

t.start()

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

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

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

信號(hào)量

信號(hào)量也提供acquire方法和release方法,每當(dāng)調(diào)用acquire方法的時(shí)候,如果內(nèi)部計(jì)數(shù)器大于0,則將其減1,如果內(nèi)部計(jì)數(shù)器等于0,則會(huì)阻塞該線程,知道有線程調(diào)用了release方法將內(nèi)部計(jì)數(shù)器更新到大于1位置。

import threadingimport timeclass Num:

def __init__(self):

self.num = 0

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

def add(self):

self.sem.acquire()#內(nèi)部計(jì)數(shù)器減1

self.num += 1

num = self.num

self.sem.release()#內(nèi)部計(jì)數(shù)器加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之多線程原理

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

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

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

總結(jié):開一個(gè)軟件,相當(dāng)于開了一個(gè)進(jìn)程。在這個(gè)軟件運(yùn)行的過程里,多個(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ù)。可以通過 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多線程之threading之Lock對(duì)象

要介紹Python的 threading 模塊中的 Lock 對(duì)象前, 首先應(yīng)該了解以下兩個(gè)概念:

1.基本概念 : 指某個(gè)函數(shù)/函數(shù)庫(kù)在多線程環(huán)境中被調(diào)用時(shí), 能夠正確地處理多個(gè)線程之間的 共享變量 , 使程序功能正常完成. 多個(gè)線程訪問同一個(gè)對(duì)象時(shí), 如果不用考慮這些線程在運(yùn)行時(shí)環(huán)境下的調(diào)度和交替執(zhí)行, 也不需要進(jìn)行額外的同步, 或者在調(diào)用方進(jìn)行任何其他操作,調(diào)用這個(gè)對(duì)象的行為都可以獲得正確的結(jié)果, 那么這個(gè)對(duì)象就是線程安全的. 或者說: 一個(gè)類或者程序所提供的接口對(duì)于線程來說是 原子操作 或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性, 也就是說我們不用考慮同步的問題.

2.示例 : 比如有間銀行只有1000元, 而兩個(gè)人同時(shí)提領(lǐng)1000元時(shí),就有可能拿到總計(jì)2000元的金額. 為了避免這個(gè)問題, 該間銀行提款時(shí)應(yīng)該使用 互斥鎖 , 即意味著對(duì)同一個(gè)資源處理時(shí), 前一個(gè)提領(lǐng)交易完成后才處理下一筆交易.

3.線程安全意義 :

4.是否線程安全 :

5.資源競(jìng)爭(zhēng) : 即多個(gè)線程對(duì)同一個(gè)資源的改寫時(shí), 存在的一種競(jìng)爭(zhēng). 如果僅僅是讀操作, 則不存在資源競(jìng)爭(zhēng)的情況.

1.基本概念 : 因?yàn)榇嬖谏鲜鏊f的 線程安全與資源競(jìng)爭(zhēng) 的情況, 所以引入了 線程鎖 . 即通過鎖來進(jìn)行資源請(qǐng)求的限制, 以保證同步執(zhí)行,避免資源被污染或預(yù)期結(jié)果不符. 線程鎖存在兩種狀態(tài): 鎖定(locked)和非鎖定(unlocked).

2.基本方法 :

3.使用示例 :

上述示例如果在不加鎖的情況下, 將會(huì)出現(xiàn)打印順序混亂的情況, 不過最終結(jié)果都是正確的, 因?yàn)榧词咕€程交替執(zhí)行, 但最終的結(jié)果都是一致.

Python多線程是什么意思?

多線程能讓你像運(yùn)行一個(gè)獨(dú)立的程序一樣運(yùn)行一段長(zhǎng)代碼。這有點(diǎn)像調(diào)用子進(jìn)程(subprocess),不過區(qū)別是你調(diào)用shu的是一個(gè)函數(shù)或者一個(gè)類,而不是獨(dú)立的程序。

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

每個(gè)進(jìn)程都有一個(gè)始終在運(yùn)行的線程。這是主線。這個(gè)主線程實(shí)際上創(chuàng)建子線程對(duì)象。子線程也由主線程啟動(dòng)。

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)概念:

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

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

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

Python 為我們提供了 ThreadPoolExecutor 來實(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 方法,若想誰先完成就返回誰,我們就用 submit+as_complete 方法。

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

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

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

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

如果把上面的鎖改為 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)行操作。

網(wǎng)站欄目:python函數(shù)多線程,python 多線程 函數(shù)
文章位置:http://chinadenli.net/article21/dsishjd.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化全網(wǎng)營(yíng)銷推廣App開發(fā)企業(yè)網(wǎng)站制作網(wǎng)站內(nèi)鏈定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管