什么是Python中的線程和多線程?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是專業(yè)的高碑店網(wǎng)站建設(shè)公司,高碑店接單;提供成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行高碑店網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
一、線程的概念
一個(gè)進(jìn)程里面至少有一個(gè)控制線程,進(jìn)程的概念只是一種抽象的概念,真正在CPU上面調(diào)度的是進(jìn)程里面的線程,就好比真正在地鐵這個(gè)進(jìn)程里面工作的實(shí)際上是地鐵里面的線程,北京地鐵里面至少要有一個(gè)線程,線程是真正干活的,線程用的是進(jìn)程里面包含的一堆資源,線程僅僅是一個(gè)調(diào)度單位,不包含資源。
什么時(shí)候需要開啟多個(gè)線程:一個(gè)進(jìn)程里面的多個(gè)線程共享這個(gè)進(jìn)程里面的資源,因此如果多個(gè)任務(wù)共享同一塊資源的時(shí)候,需要開啟多個(gè)線程。 多線程指的是,在一個(gè)進(jìn)程中開啟多個(gè)線程,簡(jiǎn)單的說:如果多個(gè)任務(wù)共用同一個(gè)資源空間,那么必須在一個(gè)進(jìn)程內(nèi)開啟多個(gè)線程。一個(gè)進(jìn)程這個(gè)任務(wù)里面可能對(duì)應(yīng)多個(gè)分任務(wù),如果一個(gè)進(jìn)程里面只開啟一個(gè)線程的話,多個(gè)分任務(wù)之間實(shí)際上是串行的執(zhí)行效果,即一個(gè)程序里面只含有一條執(zhí)行路徑。
對(duì)于計(jì)算密集型應(yīng)用,應(yīng)該使用多進(jìn)程;對(duì)于IO密集型應(yīng)用,應(yīng)該使用多線程。線程的創(chuàng)建比進(jìn)程的創(chuàng)建開銷小的多。
二、Python中線程的特點(diǎn)
1.在其他語言當(dāng)中,一個(gè)進(jìn)程里面開啟多個(gè)線程,每個(gè)線程都可以給一個(gè)cpu去使用,但是在 python當(dāng)中,在同一時(shí)刻,一個(gè)進(jìn)程當(dāng)中只能有一個(gè)線程處于運(yùn)行狀態(tài)。
2.比如在其他語言當(dāng)中,比如我現(xiàn)在開啟了一個(gè)進(jìn)程,這個(gè)進(jìn)程當(dāng)中含有幾個(gè)線程,如果我現(xiàn)在有多個(gè)cpu,每一個(gè)線程是可以對(duì)應(yīng)相應(yīng)的CPU的。
3.但是在python當(dāng)中,如果我們現(xiàn)在開啟了一個(gè)進(jìn)程,這個(gè)進(jìn)程里面對(duì)應(yīng)多個(gè)線程,同一時(shí)刻只有一個(gè)線程可以處于運(yùn)行狀態(tài)。 對(duì)于其他語言而言,在多CPU系統(tǒng)中,為了最大限度的利用多核,可以開啟多個(gè)線程。 但是Python中的多線程是利用不了多核優(yōu)勢(shì)的。
4.在同一個(gè)進(jìn)程當(dāng)中,多個(gè)線程彼此之間可以相互通信;但是進(jìn)程與進(jìn)程之間的通信必須基于IPC這種 消息的通信機(jī)制(IPC機(jī)制包括隊(duì)列和管道)。在一個(gè)進(jìn)程當(dāng)中,改變主線程可能會(huì)影響其它線程的行為,但是改變父進(jìn)程并不會(huì)影響其它子進(jìn)程的行為,因?yàn)檫M(jìn)程與進(jìn)程之間是完全隔離的。 在python當(dāng)中,在同一時(shí)刻同一進(jìn)程當(dāng)中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會(huì)被掛起。
三、多線程的理解
多進(jìn)程和多線程都可以執(zhí)行多個(gè)任務(wù),線程是進(jìn)程的一部分。線程的特點(diǎn)是線程之間可以共享內(nèi)存和變量,資源消耗少(不過在Unix環(huán)境中,多進(jìn)程和多線程資源調(diào)度消耗差距不明顯,Unix調(diào)度較快),缺點(diǎn)是線程之間的同步和加鎖比較麻煩。
四、Python多線程創(chuàng)建
在Python中,同樣可以實(shí)現(xiàn)多線程,有兩個(gè)標(biāo)準(zhǔn)模塊thread和threading,不過我們主要使用更高級(jí)的threading模塊。使用例子:
import threading import time def target(): print 'the curent threading %s is running' % threading.current_thread().name time.sleep(1) print 'the curent threading %s is ended' % threading.current_thread().name print 'the curent threading %s is running' % threading.current_thread().name t = threading.Thread(target=target) t.start() t.join() print 'the curent threading %s is ended' % threading.current_thread().name
輸出:
the curent threading MainThread is running the curent threading Thread-1 is running the curent threading Thread-1 is ended the curent threading MainThread is ended
start是啟動(dòng)線程,join是阻塞當(dāng)前線程,即使得在當(dāng)前線程結(jié)束時(shí),不會(huì)退出。從結(jié)果可以看到,主線程直到Thread-1結(jié)束之后才結(jié)束。
Python中,默認(rèn)情況下,如果不加join語句,那么主線程不會(huì)等到當(dāng)前線程結(jié)束才結(jié)束,但卻不會(huì)立即殺死該線程。如不加join輸出如下:
the curent threading MainThread is running the curent threading Thread-1 is running the curent threading MainThread is ended the curent threading Thread-1 is ended
但如果為線程實(shí)例添加t.setDaemon(True)之后,如果不加join語句,那么當(dāng)主線程結(jié)束之后,會(huì)殺死子線程。
代碼:
import threading import time def target(): print 'the curent threading %s is running' % threading.current_thread().name time.sleep(4) print 'the curent threading %s is ended' % threading.current_thread().name print 'the curent threading %s is running' % threading.current_thread().name t = threading.Thread(target=target) t.setDaemon(True) t.start() t.join() print 'the curent threading %s is ended' % threading.current_thread().name
輸出如下:
the curent threading MainThread is running the curent threading Thread-1 is runningthe curent threading MainThread is ended
如果加上join,并設(shè)置等待時(shí)間,就會(huì)等待線程一段時(shí)間再退出:
import threading import time def target(): print 'the curent threading %s is running' % threading.current_thread().name time.sleep(4) print 'the curent threading %s is ended' % threading.current_thread().name print 'the curent threading %s is running' % threading.current_thread().name t = threading.Thread(target=target) t.setDaemon(True) t.start() t.join(1)
輸出:
the curent threading MainThread is running the curent threading Thread-1 is running the curent threading MainThread is ended
主線程等待1秒,就自動(dòng)結(jié)束,并殺死子線程。如果join不加等待時(shí)間,t.join(),就會(huì)一直等待,一直到子線程結(jié)束,輸出如下:
the curent threading MainThread is running the curent threading Thread-1 is running the curent threading Thread-1 is ended the curent threading MainThread is ended
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
本文題目:什么是Python中的線程和多線程
鏈接分享:http://www.rwnh.cn/article6/gdihig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)、軟件開發(fā)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站營銷、ChatGPT
聲明:本網(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)