快
快了
啊
嘿
小老弟
想啥呢
今天這篇爬蟲教程的主題就是一個字
快
想要做到秒爬
就需要知道
什么是多進程
什么是多線程
什么是協程(微線程)
你先去沏杯茶
坐下來
小帥b這就好好給你說道說道
關於線程這玩意
沏好茶了嗎
那么
接下來就是
首先我們來了解什么是進程
進程就是正在運行的程序
比如你的系統現在運行着的微信
就是一個進程
一旦你的「微信」運行起來
系統就會給「微信」分配了內存和資源
那什么是單進程呢?
單進程就是說你的電腦只能做一件事情
比如
你在電腦打開了微信
就不能再去打開淘寶了
但是你會發現
現在你的電腦
很是牛逼
可以一邊看片一邊聽歌
可以一邊玩游戲一邊擼代碼
這就是多進程
你的電腦
在同一段時間里面
可以 “同時” 執行多個任務
這樣是不是提高了你家 CPU 的使用率了呢
其實
一個單核的 CPU 在一個時間點上只能運行一個程序
之所以你能感覺到你電腦上的程序在同時運行
是因為
CPU 在做着切換
因為 CPU 的切換速度超級快
快到讓你感覺到
你開着的所有程序好像是在同時運行
知道了什么是進程之后
我們再來談談線程
在一個進程里面
可以執行多個任務
在這里的每一個任務就是線程
線程可以說是程序用 CPU 的一個基本單元
所以
一個程序里面如果只是單一的一個執行路徑
那么它就是單線程的
一個程序如果有多個執行路徑
那么它就是多線程的
所以你想要讓你的爬蟲高效
就可以讓你的爬蟲實現多線程
這樣它就可以有更加高的幾率搶到 CPU 的執行權
每當小帥b跟別人吹線程的時候
還會說到並行和並發
我們剛剛說了
一個單核的 CPU
它每次只能執行一個進程
那么如果是多核的 CPU 呢
是不是就可以同時執行多個進程了
這就是並行
在某一個時間段里,可以同時執行多個進程
而並發呢
就是在一個時間點,同時執行多個進程
你想想
在雙十一的時候
是不是在那個晚上的 12 點
很多人同時秒殺了某一個商品
這就是並發
在系統里面
進程和進程之間是互相獨立的
而一個進程里面的多個線程
這些線程之間是共享一個進程空間的
這個時候
線程就要搞事情了
畢竟一塊蛋糕被共享了
誰都想多分一點
就擠破頭的想要搶占多一點資源
哇靠啊
這可不行啊
這樣數據就不安全了
所以就有了互斥鎖
所謂互斥鎖
就是讓線程乖一點
別他媽的亂來
一個一個線程安全有序的去執行
在 python 里呢
有一個叫做 GIL 鎖
這個鎖是干嘛的呢
它就是用來控制線程執行權限的
所以當一個線程需要執行的時候
要先獲得 GIL 之后才可以執行
這樣就不會產生線程安全問題
但有一個問題是
那他媽的還多線程個毛啊?
恩..有一點是
在 I/O 流阻塞的時候,GIL會被釋放
(I/O流就是輸入輸出流,如果你此刻不太理解這個概念也沒關系)
所以呀
我們的 Python 程序
如果是要處理多任務,想要充分的去利用我們多核的CPU
就開啟多進程(multiprocessing)
而對於一些輸入輸出的多任務
就開啟多線程(threading.Thread、multiprocessing.dummy)
哦對了
還有一個玩意叫做協程
協程也叫做微線程
在一個線程里面可以執行多個函數
線程和進程是通過系統調度的
而微線程則不需要,可以根據需要自己調度
因為微線程是函數之間在切換
所以開銷很小
在 python 中使用微線程時一般會用到 genvent、monkey.patch_all
本篇就到這里
主要讓你理解這幾個概念
下一篇
小帥b就會使用多進程、多線程、協程的方式來實現 python 的爬蟲
敬請
近期文章
python爬蟲12 | 爸爸,他使壞,用動態的 Json 數據,我要怎么搞?
python爬蟲11 | 這次,將帶你爬取b站上的NBA形象大使蔡徐坤和他的球友們
掃一掃
學習 Python 沒煩惱
點個好看啊~~(破音)