天天看點

python多程序

程序概念:

1、是計算機中的程式關于某資料集合上的一次運作活動,是系統進行資源配置設定和排程的基本機關,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向線程設計的計算機結構中,程序是線程的容器。程式是指令、資料及其組織形式的描述,程序是程式的實體。

2、對于作業系統來說,一個任務就是一個程序,比方說打開浏覽器就是啟動一個浏覽器的程序

3、程序是作業系統中最基本、重要的概念。是多道程式系統出現後,為了刻畫系統内部出現的動态情況,描述系統内部各道程式的活動規律引進的一個概念,所有多道程式設計作業系統都建立在程序的基礎上

程序和程式的差別

程式是指令和資料的有序集合,其本身沒有任何運作的含義,是一個靜态的概念

而程序是程式在處理機上的一次執行過程,它是一個動态的概念

程式可以作為一種軟體資料長期存在,而程序是有一定生命期的。

程式是永久的,程序是暫時的

程序并發和并行

并發:如果系統隻有一個CPU,實際就是交替執行任務,之後交替比較快

是指一個時間段中有幾個程式都處于已啟動運作到運作完畢之間,且這幾個程式都是在同一個處理機上運作,但任一個時刻點上隻有一個程式在處理機上運作,是指系統具有處理多個任務的能力。黑線代表同一個cpu,紅塊代表處理任務

python多程式

并行:多核cpu.當系統有一個以上CPU時,則線程的操作有可能非并發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行,這種方式我們稱之為并行(Parallel)。簡言之,是指系統具有同時處理多個任務的能力。 黑線表CPU,紅色代表cpu

python多程式

程序優點

穩定性高,一個程序山崩潰了,不會影響其他程序

程序缺點

開銷比較大

windows檢視程序--任務管理

啟動程序的步驟

1、引入程序包 multiprocessing

2、編寫函數

3、建立啟用程序

linux 下可以使用fork函數建立程序。在windows系統multiprocessing子產品

linux是多任務系統

Process 功能介紹

Process 方法介紹

Process 屬性介紹

差別主程序和子程序

1、通過程序号判斷主程序還是子程序

2、debug的時候斷點要加在子程序,如果在主程序是無法看到的子程序的代碼

os.getpid()  擷取目前程序号  os.getppid()  擷取目前父程序号

python多程式

 程序參數

 

python多程式

 程序共享變量value

<code>multiprocessing.</code><code>Value</code>(typecode_or_type, *args[, lock])

python多程式

 字元串 

from ctypes import c_char_p

ss = Value(c_char_p, 'ss')

ctype類型可從下表查閱

  

python多程式
python多程式

程序資料共享

程序池Pool(5),所謂程序池,就是控制程序的數量

close()    關閉pool,使其不在接受新的任務。

terminate()    結束工作程序,不在處理未完成的任務。

join()    主程序阻塞,等待子程序的退出, join方法要在close或terminate之後使用。

 阻塞式和非阻塞式 

-- 阻塞式 apply  apply(func[, args[, kwds]])是阻塞的

-- 阻塞程序 p = Pool(5) 程序池一共起5個程序,一個程序一個程序做任務。阻塞程序是程序1的任務1完成了,再做程序2的任務

-- 非阻塞程序 p = Pool(5) 程序池一共起5個程序,5個程序共同做任務。程序1任務完成,會再進一個新任務。

運作結果

阻塞程序hello 0

end

阻塞程序hello 1

阻塞程序hello 2

阻塞程序hello 3

-- 非阻塞式 apply_async  apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞

非阻塞程序hello 0

非阻塞程序hello 1

非阻塞程序hello 2

非阻塞程序hello 3

:::: done非阻塞程序hello 0

:::: done非阻塞程序hello 1

:::: done非阻塞程序hello 2

:::: done非阻塞程序hello 3

阻塞程序的回調函數,回調函數在爬蟲中最常用。

回調函數的場景:程序池中任何一個任務一旦處理完了,就立即告知主程序:我好了額,你可以處理我的結果了。主程序則調用一個函數去處理該結果,該函數即回調函數

我們可以把耗時間(阻塞)的任務放到程序池中,然後指定回調函數(主程序負責執行),這樣主程序在執行回調函數時就省去了I/O的過程,直接拿到的是任務的結果。

程序通信

 隊列

上班求生存,下班求發展

繼續閱讀