首先我們來(lái)了解下python中的進(jìn)程,,線程以及協(xié)程! 從計(jì)算機(jī)硬件角度: 計(jì)算機(jī)的核心是CPU,,承擔(dān)了所有的計(jì)算任務(wù),。 一個(gè)CPU,在一個(gè)時(shí)間切片里只能運(yùn)行一個(gè)程序,。 從操作系統(tǒng)的角度: 進(jìn)程和線程,,都是一種CPU的執(zhí)行單元。 進(jìn)程:表示一個(gè)程序的上下文執(zhí)行活動(dòng)(打開(kāi),、執(zhí)行,、保存...) 線程:進(jìn)程執(zhí)行程序時(shí)候的最小調(diào)度單位(執(zhí)行a,執(zhí)行b...) 一個(gè)程序至少有一個(gè)進(jìn)程,,一個(gè)進(jìn)程至少有一個(gè)線程,。 并行 和 并發(fā): 并行:多個(gè)CPU核心,不同的程序就分配給不同的CPU來(lái)運(yùn)行,??梢宰尪鄠€(gè)程序同時(shí)執(zhí)行。 cpu1 ------------- cpu2 ------------- cpu3 ------------- cpu4 ------------- 并發(fā):?jiǎn)蝹€(gè)CPU核心,,在一個(gè)時(shí)間切片里一次只能運(yùn)行一個(gè)程序,,如果需要運(yùn)行多個(gè)程序,則串行執(zhí)行,。 cpu1 ---- ---- cpu1 ---- ---- 多進(jìn)程/多線程: 表示可以同時(shí)執(zhí)行多個(gè)任務(wù),,進(jìn)程和線程的調(diào)度是由操作系統(tǒng)自動(dòng)完成。 進(jìn)程:每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間,,不同進(jìn)程之間的內(nèi)存空間不共享,。 進(jìn)程之間的通信有操作系統(tǒng)傳遞,導(dǎo)致通訊效率低,,切換開(kāi)銷(xiāo)大,。 線程:一個(gè)進(jìn)程可以有多個(gè)線程,所有線程共享進(jìn)程的內(nèi)存空間,,通訊效率高,,切換開(kāi)銷(xiāo)小。 共享意味著競(jìng)爭(zhēng),,導(dǎo)致數(shù)據(jù)不安全,,為了保護(hù)內(nèi)存空間的數(shù)據(jù)安全,引入'互斥鎖',。 一個(gè)線程在訪問(wèn)內(nèi)存空間的時(shí)候,,其他線程不允許訪問(wèn),,必須等待之前的線程訪問(wèn)結(jié)束,才能使用這個(gè)內(nèi)存空間,。 互斥鎖:一種安全有序的讓多個(gè)線程訪問(wèn)內(nèi)存空間的機(jī)制,。 Python的多線程: GIL 全局解釋器鎖:線程的執(zhí)行權(quán)限,在Python的進(jìn)程里只有一個(gè)GIL,。 一個(gè)線程需要執(zhí)行任務(wù),,必須獲取GIL。 好處:直接杜絕了多個(gè)線程訪問(wèn)內(nèi)存空間的安全問(wèn)題,。 壞處:Python的多線程不是真正多線程,,不能充分利用多核CPU的資源。 但是,,在I/O阻塞的時(shí)候,,解釋器會(huì)釋放GIL。 所以: 多進(jìn)程:密集CPU任務(wù),,需要充分使用多核CPU資源(服務(wù)器,大量的并行計(jì)算)的時(shí)候,,用多進(jìn)程,。 multiprocessing 缺陷:多個(gè)進(jìn)程之間通信成本高,切換開(kāi)銷(xiāo)大,。 多線程:密集I/O任務(wù)(網(wǎng)絡(luò)I/O,,磁盤(pán)I/O,數(shù)據(jù)庫(kù)I/O)使用多線程合適,。 threading.Thread,、multiprocessing.dummy 缺陷:同一個(gè)時(shí)間切片只能運(yùn)行一個(gè)線程,不能做到高并行,,但是可以做到高并發(fā),。 協(xié)程:又稱(chēng)微線程,在單線程上執(zhí)行多個(gè)任務(wù),,用函數(shù)切換,,開(kāi)銷(xiāo)極小。不通過(guò)操作系統(tǒng)調(diào)度,,沒(méi)有進(jìn)程,、線程的切換開(kāi)銷(xiāo)。genvent,,monkey.patchall 多線程請(qǐng)求返回是無(wú)序的,,那個(gè)線程有數(shù)據(jù)返回就處理那個(gè)線程,而協(xié)程返回的數(shù)據(jù)是有序的,。 缺陷:?jiǎn)尉€程執(zhí)行,,處理密集CPU和本地磁盤(pán)IO的時(shí)候,,性能較低。處理網(wǎng)絡(luò)I/O性能還是比較高. 下面以這個(gè)網(wǎng)站為例,,采用三種方式爬取,。爬取前250名的電影。,。 https://movie.douban.com/top250?start=0 通過(guò)分析網(wǎng)頁(yè)發(fā)現(xiàn)第2頁(yè)的url start=25,,第3頁(yè)的url start=50,第3頁(yè)的start=75。因此可以得出這個(gè)網(wǎng)站每一頁(yè)的數(shù)局是通過(guò)遞增start這個(gè)參數(shù)獲取的,。 一般不看第一頁(yè)的數(shù)據(jù),,第一頁(yè)的沒(méi)有參考價(jià)值。 這次我們主要爬取,,電影名字跟評(píng)分。只是使用不同方式去對(duì)比下不同點(diǎn),,所以數(shù)據(jù)方面就不過(guò)多提取或者保存,。只是簡(jiǎn)單的將其爬取下打印出來(lái)看看。 第一:采用多進(jìn)程 , multiprocessing 模塊,。 當(dāng)然這個(gè)耗時(shí)更網(wǎng)絡(luò)好壞有關(guān),。在全部要請(qǐng)求都正常的情況下耗時(shí)15s多。 代碼還是自己敲吧 代碼還是自己敲吧 代碼還是自己敲吧 代碼還是自己敲吧 代碼還是自己敲吧 代碼還是自己敲吧 采用多線程時(shí),,耗時(shí)10.4s 采用協(xié)程爬取,,耗時(shí)15S,, 用了多進(jìn)程,多線程,,協(xié)程,,實(shí)現(xiàn)的代碼都一樣,沒(méi)有測(cè)試出明顯的那個(gè)好,!都不分上下,,可能跟網(wǎng)絡(luò),或者服務(wù)器配置有關(guān),。 但理論上來(lái)說(shuō)線程,,協(xié)程在I/O密集的操作性能是要高于進(jìn)程的。 確實(shí)有點(diǎn)難度,,不會(huì)的小伙伴還需努力,,謝謝閱讀! |
|
來(lái)自: 藍(lán)天cipvfv9gyo > 《工業(yè)4.0》