程式
程式:編寫完的**稱為程式。
程序程序:又稱重量級程序,正在執行中的程式稱為程序。程序的執行會占用記憶體等資源。多個程序同時執行時,每個程序的執行都需要由作業系統按一定的演算法(rr排程、優先數排程演算法等)分配記憶體空間。
並行與併發
並行:在多核系統中,每個cpu執行乙個程序,可以理解為cpu的數大於程序數,所有程序同時進行。
併發:在作業系統中同時執行多個程序,可以理解為cpu的數小於程序數,有些程序會沒有機會執行。
併發與並行的區別:並行指兩個或多個程式在同一時刻執行;併發指兩個或多個程式在同一時間間隔內發生,可以理解為在表面上看是同時進行,但在同一時刻只有少於程式的總數的程式在執行,計算機利用自己的排程演算法讓這些程式分時的交叉執行,由於交換的時間非常短暫,巨集觀上就像是在同時進行一樣。
多程序在python中,每乙個執行的程式都有乙個主程序,可以利用模組中封裝的方法來建立子程序。
1、利用os模組中的fork()來建立子程序
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下沒有。
2、利用multiprocessing模組process類建立程序
在multiprocessing模組中提供乙個process()類來建立程序,直接上**:
from multiprocessing importprocessimporttimedeftest(a):for i inrange(a):print("子程序...")
time.sleep(1)
p= process(target=test,args=(5,))
p.start()
p.join(2)whiletrue: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():使程序立即終止
3、利用process類的子類來建立程序
from multiprocessing importprocessimporttimeclassnewprocess(process):def __init__(self,num):
self.num=num
super().__init__()defrun(self):print("開始重寫run了")
i=0whiletrue:
time.sleep(1)
i+= 1
print("子程序",i)if i ==self.num:breakp= newprocess(6)
p.start()
p.join(2)whiletrue:ifp.is_alive():print("父程序")
time.sleep(1)elif notp.is_alive():print("子程序結束了")break
這個方法核心就是建立乙個process類的子類,利用重寫run()方法來實現任務的新增。
4、利用multiprocessing模組程序池pool建立程序
process類適合用於建立所需程序數量不多的情況,如果需要建立大量的程序,則需要利用程序池來建立程序。
from multiprocessing importpoolimporttimeimportosdefwork(i):
time.sleep(1)print(i,"當前程式的pid=",os.getpid())defwork1(i):
time.sleep(1)print(i,"當前程式的pid=",os.getpid())defwork2(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()後面使用。
python中迭代器的基本方法 Python迭代器
迭代器是可以迭代的物件。在本教程中,您將了解迭代器的工作原理,以及如何使用 iter 和 next 方法構建自己的迭代器。迭代器在python中無處不在。它們優雅地實現在迴圈,推導,生成器等中,但隱藏在明顯的視覺中。python中的迭代器只是乙個可以迭代的物件。乙個將一次返回資料的物件或乙個元素。從...
python中的程序
乙個程式執行起來後,用到的資源 稱之為程序,它是作業系統分配資源的基本單元。乙個程序中至少有乙個執行緒。1 多程序之間不會修改全域性變數,多程序之間共享資源用 訊息佇列 先進先出,後進後出 queue。2 結論 每個子程序在執行前都會複製乙份主程序 多程序之間特別占用資源。建立程序 1 匯入mult...
Python中的程序
import os import time from multiprocessing import process nums 1,2,3 def wroker1 子程序要執行的 print 程序1中的記憶體位址 s id nums print in process1 pip d,nums s os....