程式:編寫完的**稱為程式。
程序:又稱重量級程序,正在執行中的程式稱為程序。程序的執行會占用記憶體等資源。多個程序同時執行時,每個程序的執行都需要由作業系統按一定的演算法(rr排程、優先數排程演算法等)分配記憶體空間。
並行:在多核系統中,每個cpu執行乙個程序,可以理解為cpu的數大於程序數,所有程序同時進行。
併發:在作業系統中同時執行多個程序,可以理解為cpu的數小於程序數,有些程序會沒有機會執行。
併發與並行的區別:並行指兩個或多個程式在同一時刻執行;併發指兩個或多個程式在同一時間間隔內發生,可以理解為在表面上看是同時進行,但在同一時刻只有少於程式的總數的程式在執行,計算機利用自己的排程演算法讓這些程式分時的交叉執行,由於交換的時間非常短暫,巨集觀上就像是在同時進行一樣。
在python中,每乙個執行的程式都有乙個主程序,可以利用模組中封裝的方法來建立子程序。
import os, time
pid = os.fork()
print("外面的pid",pid)
if pid == 0:
print("子程序中的程式")
print("子程序的pid=", os.getpid())
print("父程序的pid=", os.getppid())
elif pid > 0:
print("父程序中的程式")
print("子程序的pid=", os.getpid())
print("父程序的pid=", os.getppid())
else :
print("建立失敗")
解釋:
os.fork():os模組中用來建立子程序的方法,當程式執行到os.fork()時,作業系統會將當前的程序複製乙份,原來的程序稱為父程序,新建立的程序稱為子程序,兩個程序會各自互不干擾的執行下面的程式,父程序與子程序的執行順序與系統排程有關。父程序與子程序都會在os.fork()中得到乙個返回值,子程序的返回值為0,父程序的返回值為子程序的程序號,這個值永遠大於零,具體數值由作業系統分配,如果返回值為負數則表明建立子程序失敗。
os.getpid():獲取程序的程序號。
os.getppid():獲取父程序的程序號。
來張了解下
注意:這個os.fork()方法只有在unix系統中才會有,在window下沒有。
在multiprocessing模組中提供乙個process()類來建立程序,直接上**:
from multiprocessing import process
import time
def test(a):
for i in range(a):
print("子程序...")
time.sleep(1)
p = process(target=test,args=(5,))
p.start()
p.join(2)
while true:
print("父程序...")
time.sleep(1)
解釋:
這裡的p相當於process類的乙個例項物件,每例項化乙個物件就是建立乙個子程序。
target = test :子程序所執行的任務,就是test這個函式
args = (5,) :給程序函式傳參,這裡需要用元祖的方式進行傳參
p.start() :執行子程序,只用呼叫start()方法,子進才會執行
p.join(n) :讓主程序等待n秒鐘
在程序結束後,主程序會等待子程序先結束,如果主程序先結束,那麼所有的子程序都會結束。
process常用的方法:
start():啟動程序
is_alive() :判斷程序是否還在執行,返回true 或 false
join(n) : 主程序等待子程序,n為等待的時間(秒)
run() :在呼叫start方法時會自動呼叫run()方法,可以建立process類的子類來重寫run()方法的方式建立程序
terminate():使程序立即終止
from multiprocessing import process
import time
class newprocess(process):
def __init__(self,num):
self.num = num
super().__init__()
def run(self):
print("開始重寫run了")
i = 0
while true:
time.sleep(1)
i += 1
print("子程序",i)
if i == self.num:
break
p = newprocess(6)
p.start()
p.join(2)
while true:
if p.is_alive():
print("父程序")
time.sleep(1)
elif not p.is_alive():
print("子程序結束了")
break
這個方法核心就是建立乙個process類的子類,利用重寫run()方法來實現任務的新增。
process類適合用於建立所需程序數量不多的情況,如果需要建立大量的程序,則需要利用程序池來建立程序。
from multiprocessing import pool
import time
import os
def work(i):
time.sleep(1)
print(i,"當前程式的pid=",os.getpid())
def work1(i):
time.sleep(1)
print(i,"當前程式的pid=",os.getpid())
def work2(i):
time.sleep(1)
print(i,"當前程式的pid=",os.getpid())
# 建立程序池
pool = pool(2)
# 使程序開始執行
# 關閉程序池
pool.close()
# 讓主程序等待子程序
pool.join()
解釋:
pool = pool(2)為建立乙個程序池,程序池中同時開兩個程序,如果任務多於程序數時,程序會逐個執行任務,當乙個程序完成任務後,接著執行待完成的任務,直到所有任務全部完成。
pool.close() :關閉程序池,停止向程序池中新增任務
pool.join() :使主程序等待。必須在close()或者terninate()後面使用。
這個怎麼用啊?沒用過
toc這個怎麼用啊 沒用過 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下markdown的基本語法知識。全新的介面設計,將會帶來全新的寫作體驗 在創作中心設定你喜愛的 高亮樣式,markdown將 片顯示選擇的...
Python面向啊物件(四)
new 方法 new 方法是由object基類提供的內建方法,主要用來建立單例類 物件建立時 new 方法首先為物件分配乙個記憶體空間 如果類中沒有顯式定義 new 方法,則類中的 new 方法繼承自object基類 然後 new 方法返回物件的引用,init 方法接收到返回的物件引用後才會開始初始...
python 程序 python程序
python程序池pool 當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態生成多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool是,可以指定乙個最大程序...