1. 程式人生 > >(4)程序(子程序的開啟)

(4)程序(子程序的開啟)

序列問題:

多道處理技術 (*******************)
1. 時間的複用,cpu在多個任務之間不斷的進行切換

2. 空間的複用
多個任務必須開闢屬於自己的記憶體空間 (物理級別的隔離)

相關概念:(*******************)
cpu: 計算執行任務的 不會執行IO操作(I/O輸入/輸出(Input/Output))

cpu切換的條件:
1. 遇到IO操作,就切換
2. 遇到優先順序比較高的任務會進行切換
3. 如果某一個任務長時間佔用CPU資源,也會切換 , 要所有的任務雨露均沾

 

什麼是序列、併發以及並行

a. 序列 : 程式一個接一個的執行
b. 併發 : 單個CPU執行多個程式任務, CPU在程式之間不斷的進行切換, 感覺好像是並行 (偽並行)
c. 並行 : 多個CPU同時執行多個程式任務

 

 

什麼是程序
程序和程式的區別:
程式:靜態的程式程式碼
程序:正在執行的程式

 

程序的開啟方式(有兩種方式)

開啟程序需要呼叫multprocessing包下的Process

程序開啟方式1,函式方式 (推薦這種方式,簡單明瞭)
import time
from multiprocessing import Process #呼叫multprocessing包


def task(x):
print('%s is running' % x)
time.sleep(2)
print('%s is done' % x)


if __name__ == '__main__':
p = Process(target=task, args=('子程序',)) #開啟程序需要例項化,開始程序例項
PS:例項化程序,需要執行的任務的目標函式就是task。當呼叫的時候就會將‘子程序’傳給task函式的形參x

p.start() #向作業系統申請資源,開啟子程序(包括子程序的空間大小,子程序的pid號,)
print('主...')

PS:Process裡面的引數,traget就是執行任務的目標函式,args必須傳入一個元祖(‘子程序’,),kwargs傳一個字典{‘x’: '子程序'}就是傳入的值(value)要賦值給哪一個變數(key)

PS:執行程式的時候,是從上而下執行的,所以在程式執行到開啟子程序的時候(p.start),就是在主程序裡開啟了一個子程序,p.start這裡就是向作業系統申請了一塊記憶體空間,然後執行子程序的程式,但是申請的時間是慢於主程序,因為程式是一直由上而下的執行,不會停頓,開啟子程序需要申請記憶體空間,這個動作是要向作業系統去申請,然後作業系統開闢一個記憶體空間給子程序,這一個過程是非常耗費資源和時間的,所以主程序的速度是快於子程序

程序開啟方式2 類方式
from multiprocessing import Process
import time

class MyProcess(Process): #自己寫一個類,但是這個類必須要繼承Process類的

def __init__(self,x = None): #
super(MyProcess,self).__init__() #因為是繼承Prcess類,所以要在Process類的基礎上增加我們自己要的引數,要重寫初始化函式
self.x = x #self.x是成員變數

def run(self): #子程序執行的這個函式不能亂寫,必須要重寫Process類下面的run
print('%s is running'%self.x)
print('%s is done' %self.x)

if __name__ == '__main__':
p = MyProcess('子程序') #這裡例項化的是自己寫的類
p.start()
print('主...')