加個“星標”,每天一起快樂的學習
今
日
雞
湯
置酒長安道,同心與我違。
前言
程序,一個新鮮的字眼,可能有些人並不瞭解,它是系統某個執行程式的載體,這個程式可以有單個或者多個程序,一般來說,程序是透過系統CPU 核心數來分配並設定的,我們可以來看下系統中的程序:
可以看到,360瀏覽器是真的皮,這麼多程序啊,當然可以這樣來十分清楚的看程序執行緒使用情況:
透過任務管理器中的資源監視器,是不是很厲害了,哈哈哈。講完了這些,再說說用法。
1。基本用法
程序能幹什麼,這是我們要深思熟慮的事情。我們都知道一個程式執行會建立程序,所以程式在建立這些程序的時候,為了讓它們更能有條不紊的工作,肯定也加入了執行緒。
那麼一條程序裡面就會有多個執行緒協同作戰,但是程序不可以建立過多,不然會消耗資源,除非你開發的是一個大型的系統。那麼,我們現在就來建立一個程序吧。
一、建立程序
1。在建立程序之前,我們先匯入程序的模組,程式碼如下:
其實這種寫法是不對的,就好比bs4中的BeautifulSoup,你想透過先匯入bs4,然後再引入BeautifulSoup是行不通的,必須這樣:
可以看出程序和執行緒的用法基本差不多,只是名稱功能不同而已。而且還有很多其它優秀的方法:
2。建立單個程序
由上述引數可知函式的返回值,基本與執行緒無差異化。
請注意:建立程序務必將它加入如下語句中:
這樣就實現了我們的一個關於程序的程式了。另外我們也可以透過繼承程序類來實現:
可以說我們每建立一個程序它就會有一個ID來標誌它,下面情況:
3。建立多個程序
單個程序往往都是不夠用的,所有我們需要建立一個多程序,多程序建立方法也很簡單,加一層迴圈即可:
這樣就輕鬆建立了多程序的任務,速度比以往就要更快了。
4。程序池
程序池的設計之初就是為了方便我們更有效的利用資源,避免浪費,如果任務量大就多個核一起幫忙,如果少就只開一兩個核,下面我們來看看實現過程:
首先匯入包:
程序池的安裝包為Pool,然後我們來看下它的CPU核心數:
緊接著我們在來建立程序池:
程序池中也有很多方法供我們使用:
為此我們可以建立同步和非同步的程式,如果你對這對於爬蟲來說是很不錯的選擇,小點的爬蟲同步就好,大的爬蟲非同步效果更佳,很多人不瞭解非同步和同步,其實同步非同步就是序列和並行的意思序列和並行簡單點說就是串聯和並聯。下面我們透過例項一起來看一下:
一、序列
二、並行
可以看到,僅僅只是一個引數的變化而已,其它的都是大同小異,我們獲取到了當前程序的pid,然後把它打印出來了。
5。鎖
雖然非同步程式設計多程序給我們帶來了便利,但是程序啟動後是不可控的,我們需要將它控制住,讓它幹我們覺得有意義的事,這個時候我們需要給它加鎖,和執行緒一樣都是lock:
首先匯入程序鎖的模組:
然後我們來建立一個關於鎖的程式:
可以看到,加鎖的過程還是比較順利的,跟多執行緒一樣簡單,但是相對來說速度會慢一點。既然有Lock,那麼勢必就有RLock了,在python 中,程序和執行緒的很多用法一致,鎖就是。我們可以把它改為RLock,下面便是可重入鎖,也就是可以遞迴:
6。程序間通訊一、Event
程序間用於通訊,方法和執行緒的一模一樣,這裡舉個小栗子,不在詳細描述,不懂的可以看我上一篇關於執行緒的文章,我們今天要講的是其它的程序間通訊方式,下面請看:
二、管道傳遞訊息
管道模組初始化後返回兩個引數,一個為傳送者,一個為接收者,它有個引數可以設定模式為全雙工或者半雙工,全雙工收發一體,半雙工只收或者只發,先了解下它的方法:
先收後發,其實我們完全可以使用鎖來控制它的首發,可以讓它一邊收一邊發。
三、佇列
佇列與其它不同的是它採取插入和刪除的方法,讓我們來看下:
以上講的佇列主要用於多程序的佇列,還有一個程序池的佇列,它在Manager模組中。
7。訊號量
與執行緒中完全一樣,這裡不在贅述,看下例:
8。資料共享
共享資料型別可以直接透過程序模組來設定:
也可以透過程序的Manager模組來實現:
下面我們就來舉例說明下吧:
可以看到我們成功的將資料添加了進去,形成了資料的共享。
2。總結
透過對程序的描述,相信大家對程序此刻有了個深刻的感悟了吧,突然想起個事,就是大家學習時可能查資料會在網上搜索,那麼我建議你專心看好我這篇好了,因為據我所知,那些都是錯的,而且更讓我納悶的是,明明程式碼是錯的,放出來的執行效果卻是對的,這讓我百思不得其解,哈哈哈。
我將自己的
原創文章
整理成了一本電子書,取名《
Python修煉之道
》,一共 400 頁,17w+ 字,目錄如下:
掃描上方二維碼即可關注