python模拟并发是多线程_Python并发编程之多线程
目錄
一 什么是線程
在傳統(tǒng)操作系統(tǒng)中,每個進(jìn)程有一個地址空間,而且默認(rèn)就有一個控制線程
線程顧名思義,就是一條流水線工作的過程,一條流水線必須屬于一個車間,一個車間的工作過程是一個進(jìn)程
車間負(fù)責(zé)把資源整合到一起,是一個資源單位,而一個車間內(nèi)至少有一個流水線
流水線的工作需要電源,電源就相當(dāng)于cpu
所以,進(jìn)程只是用來把資源集中到一起(進(jìn)程只是一個資源單位,或者說資源集合),而線程才是cpu上的執(zhí)行單位。
多線程(即多個控制線程)的概念是,在一個進(jìn)程中存在多個控制線程,多個控制線程共享該進(jìn)程的地址空間,相當(dāng)于一個車間內(nèi)有多條流水線,都共用一個車間的資源。
二 線程的創(chuàng)建開銷小
創(chuàng)建進(jìn)程的開銷要遠(yuǎn)大于線程?
如果我們的軟件是一個工廠,該工廠有多條流水線,流水線工作需要電源,電源只有一個即cpu(單核cpu)
一個車間就是一個進(jìn)程,一個車間至少一條流水線(一個進(jìn)程至少一個線程)
創(chuàng)建一個進(jìn)程,就是創(chuàng)建一個車間(申請空間,在該空間內(nèi)建至少一條流水線)
而建線程,就只是在一個車間內(nèi)造一條流水線,無需申請空間,所以創(chuàng)建開銷小
進(jìn)程之間是競爭關(guān)系,線程之間是協(xié)作關(guān)系?
車間直接是競爭/搶電源的關(guān)系,競爭(不同的進(jìn)程直接是競爭關(guān)系,是不同的程序員寫的程序運行的,迅雷搶占其他進(jìn)程的網(wǎng)速,360把其他進(jìn)程當(dāng)做病毒干死)
一個車間的不同流水線式協(xié)同工作的關(guān)系
三 線程與進(jìn)程的區(qū)別
1、線程共享創(chuàng)建該線程的進(jìn)程的內(nèi)存空間;進(jìn)程有自己的內(nèi)存空間。
2、線程可以直接訪問其進(jìn)程的數(shù)據(jù)段;進(jìn)程有自己的父進(jìn)程的數(shù)據(jù)段副本。
3、線程可以直接與其進(jìn)程的其他線程通信;進(jìn)程必須使用進(jìn)程間通信來與兄弟進(jìn)程通信。
4、新線程容易創(chuàng)建;新進(jìn)程需要復(fù)制父進(jìn)程。
5、線程可以對同一進(jìn)程的線程執(zhí)行相當(dāng)大的控制;進(jìn)程只能對子進(jìn)程執(zhí)行控制。
6、主線程的更改(取消、優(yōu)先級更改等)可能影響進(jìn)程的其他線程的行為;父進(jìn)程的更改不影響子進(jìn)程。
四 為何要用多線程
多線程指的是,在一個進(jìn)程中開啟多個線程,簡單的講:如果多個任務(wù)共用一塊地址空間,那么必須在一個進(jìn)程內(nèi)開啟多個線程。詳細(xì)的講分為4點:
多線程共享一個進(jìn)程的地址空間
線程比進(jìn)程更輕量級,線程比進(jìn)程更容易創(chuàng)建可撤銷,在許多操作系統(tǒng)中,創(chuàng)建一個線程比創(chuàng)建一個進(jìn)程要快10-100倍,在有大量線程需要動態(tài)和快速修改時,這一特性很有用
若多個線程都是cpu密集型的,那么并不能獲得性能上的增強(qiáng),但是如果存在大量的計算和大量的I/O處理,擁有多個線程允許這些活動彼此重疊運行,從而會加快程序執(zhí)行的速度。
在多cpu系統(tǒng)中,為了最大限度的利用多核,可以開啟多個線程,比開進(jìn)程開銷要小的多。(這一條并不適用于python)
五 經(jīng)典的線程模型
多個線程共享同一個進(jìn)程的地址空間中的資源,是對一臺計算機(jī)上多個進(jìn)程的模擬,有時也稱線程為輕量級的進(jìn)程
而對一臺計算機(jī)上多個進(jìn)程,則共享物理內(nèi)存、磁盤、打印機(jī)等其他物理資源。
多線程的運行也多進(jìn)程的運行類似,是cpu在多個線程之間的快速切換。
不同的進(jìn)程之間是充滿敵意的,彼此是搶占、競爭cpu的關(guān)系,如果迅雷會和QQ搶資源。而同一個進(jìn)程是由一個程序員的程序創(chuàng)建,所以同一進(jìn)程內(nèi)的線程是合作關(guān)系,一個線程可以訪問另外一個線程的內(nèi)存地址,大家都是共享的,一個線程干死了另外一個線程的內(nèi)存,那純屬程序員腦子有問題。
類似于進(jìn)程,每個線程也有自己的堆棧
不同于進(jìn)程,線程庫無法利用時鐘中斷強(qiáng)制線程讓出CPU,可以調(diào)用thread_yield運行線程自動放棄cpu,讓另外一個線程運行。
線程通常是有益的,但是帶來了不小程序設(shè)計難度,線程的問題是:
父進(jìn)程有多個線程,那么開啟的子線程是否需要同樣多的線程
如果是,那么附近中某個線程被阻塞,那么copy到子進(jìn)程后,copy版的線程也要被阻塞嗎,想一想nginx的多線程模式接收用戶連接。
在同一個進(jìn)程中,如果一個線程關(guān)閉了問題,而另外一個線程正準(zhǔn)備往該文件內(nèi)寫內(nèi)容呢?
如果一個線程注意到?jīng)]有內(nèi)存了,并開始分配更多的內(nèi)存,在工作一半時,發(fā)生線程切換,新的線程也發(fā)現(xiàn)內(nèi)存不夠用了,又開始分配更多的內(nèi)存,這樣內(nèi)存就被分配了多次,這些問題都是多線程編程的典型問題,需要仔細(xì)思考和設(shè)計。
六 POSIX線程
為了實現(xiàn)可移植的線程程序,IEEE在IEEE標(biāo)準(zhǔn)1003.1c中定義了線程標(biāo)準(zhǔn),它定義的線程包叫Pthread。大部分UNIX系統(tǒng)都支持該標(biāo)準(zhǔn),簡單介紹如下

七 在用戶空間實現(xiàn)的線程
線程的實現(xiàn)可以分為兩類:用戶級線程(User-Level Thread)和內(nèi)核線線程(Kernel-Level Thread),后者又稱為內(nèi)核支持的線程或輕量級進(jìn)程。在多線程操作系統(tǒng)中,各個系統(tǒng)的實現(xiàn)方式并不相同,在有的系統(tǒng)中實現(xiàn)了用戶級線程,有的系統(tǒng)中實現(xiàn)了內(nèi)核級線程。
用戶級線程內(nèi)核的切換由用戶態(tài)程序自己控制內(nèi)核切換,不需要內(nèi)核干涉,少了進(jìn)出內(nèi)核態(tài)的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這么做的。
在用戶空間模擬操作系統(tǒng)對進(jìn)程的調(diào)度,來調(diào)用一個進(jìn)程中的線程,每個進(jìn)程中都會有一個運行時系統(tǒng),用來調(diào)度線程。此時當(dāng)該進(jìn)程獲取cpu時,進(jìn)程內(nèi)再調(diào)度出一個線程去執(zhí)行,同一時刻只有一個線程執(zhí)行。
八 在內(nèi)核空間實現(xiàn)的線程
內(nèi)核級線程:切換由內(nèi)核控制,當(dāng)線程進(jìn)行切換的時候,由用戶態(tài)轉(zhuǎn)化為內(nèi)核態(tài)。切換完畢要從內(nèi)核態(tài)返回用戶態(tài);可以很好的利用smp,即利用多核cpu。windows線程就是這樣的。

九 用戶級與內(nèi)核級線程的對比
一: 以下是用戶級線程和內(nèi)核級線程的區(qū)別
內(nèi)核支持線程是OS內(nèi)核可感知的,而用戶級線程是OS內(nèi)核不可感知的。
用戶級線程的創(chuàng)建、撤消和調(diào)度不需要OS內(nèi)核的支持,是在語言(如Java)這一級處理的;而內(nèi)核支持線程的創(chuàng)建、撤消和調(diào)度都需OS內(nèi)核提供支持,而且與進(jìn)程的創(chuàng)建、撤消和調(diào)度大體是相同的。
用戶級線程執(zhí)行系統(tǒng)調(diào)用指令時將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時,只導(dǎo)致該線程被中斷。
在只有用戶級線程的系統(tǒng)內(nèi),CPU調(diào)度還是以進(jìn)程為單位,處于運行狀態(tài)的進(jìn)程中的多個線程,由用戶程序控制線程的輪換運行;在有內(nèi)核支持線程的系統(tǒng)內(nèi),CPU調(diào)度則以線程為單位,由OS的線程調(diào)度程序負(fù)責(zé)線程的調(diào)度。
用戶級線程的程序?qū)嶓w是運行在用戶態(tài)下的程序,而內(nèi)核支持線程的程序?qū)嶓w則是可以運行在任何狀態(tài)下的程序。
二: 內(nèi)核線程的優(yōu)缺點
優(yōu)點:
當(dāng)有多個處理機(jī)時,一個進(jìn)程的多個線程可以同時執(zhí)行。
缺點:
由內(nèi)核進(jìn)行調(diào)度。
三: 用戶進(jìn)程的優(yōu)缺點
優(yōu)點:
線程的調(diào)度不需要內(nèi)核直接參與,控制簡單。
可以在不支持線程的操作系統(tǒng)中實現(xiàn)。
創(chuàng)建和銷毀線程、線程切換代價等線程管理的代價比內(nèi)核線程少得多。
允許每個進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活。
線程能夠利用的表空間和堆棧空間比內(nèi)核級線程多。
同一進(jìn)程中只能同時有一個線程在運行,如果有一個線程使用了系統(tǒng)調(diào)用而阻塞,那么整個進(jìn)程都會被掛起。另外,頁面失效也會產(chǎn)生同樣的問題。
缺點:
資源調(diào)度按照進(jìn)程進(jìn)行,多個處理機(jī)下,同一個進(jìn)程中的線程只能在同一個處理機(jī)下分時復(fù)用
十 混合實現(xiàn)
用戶級與內(nèi)核級的多路復(fù)用,內(nèi)核同一調(diào)度內(nèi)核線程,每個內(nèi)核線程對應(yīng)n個用戶線程

總結(jié)
以上是生活随笔為你收集整理的python模拟并发是多线程_Python并发编程之多线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作中应用计算机,浅谈计算机在我国计工作
- 下一篇: 清华计算机本科待遇,2021年清华大学报