--編寫完的**,沒有執行時稱為程式,正在執行的**,稱為程序。
--程式是死的(靜態的)程序是活的(動態的)
作業系統輪流讓各個任務交替執行,由於cpu的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
多程序中,每個程序中所有資料(包括全域性變數)都各自擁有乙份,互不影響。
例如:我們啟動了qq,qq就是乙個主程序,在qq執行過程中,我們分別開啟了三個(和a b c同學的)聊天視窗,這時 每個視窗就是屬於主程序下的乙個子程序,我們和每個同學聊天的資料都各有乙份,互不影響。
#模擬多工處理:一邊唱歌,一邊跳舞
from time import sleep
def sing():
for i in range(5):
print("唱歌")
dance()
sleep(1)
def dance():
print("跳舞")
sing()
程式開始執行時,首先會建立乙個主程序,在主程序下,我們可以建立新的程序(子程序),子程序依賴於主程序,如果主程序結束,程式會退出。(例如:qq執行過程中(主程序)我們開啟了和多位好友的聊天視窗(子程序),和他們聊天,這時如果直接退出qq,聊天視窗也會消失。)
python提供了非常好用的多程序包multiprocessing,借助這個包,可以輕鬆完成從單程序到併發執行的轉換。
multiprocessing模組提供了乙個process類來建立乙個程序物件。
(也就是說process類中把程序物件該有的特徵都寫入了,有了process類,方便我們建立程序物件)
引數介紹:
-target 表示呼叫物件,即子程序要執行的任務
-args 表示呼叫物件的位置引數元組
-name 子程序的名稱
from multiprocessing import process
def run(name):
print("子程序執行中,name=%s"%name)
print("子程序結束")
# print(a)
if __name__ == '__main__':
print("父程序啟動")
# a = 1000
p=process(target=run,args=('test',),name='pro-1')
#"="右邊是建立的子程序物件,p是該物件的引用 name='pro-1'可以不寫,系統會預設起名: process-n(是第幾個子程序就叫-幾)
#target表示呼叫物件,args表示呼叫物件的位置引數元組
#注意:元組中只有乙個元素時結尾要加,
print("子程序將要執行")
p.daemon=true #是否設定為守護程序(主程序結束,子程序也結束)(如果主程序結束,子程序還在執行,那麼這個子程序叫孤兒程序)
p.start()#此時子程序執行,cpu中主程序和子程序頻繁做切換
#在子程序執行時有個問題:在windows上,子程序執行時會自動import啟動它的這個檔案(主程序),而在import的時候是會執行這些語句的,
#這些語句中包含了建立乙個子程序物件,因此會導致遞迴(無限建立子程序)
print(p.name)
p.join()#此處join()的作用:讓主程序等子程序執行完再退出(因為程式執行過程中如果主程序退出,此時子程序未執行完,也會退出)
print("主程序結束")
'''if __name__=='__main__':說明
乙個python的檔案(模組)有兩種使用的方法,第一是直接作為程式執行,
第二是被其他python模組匯入(import)呼叫執行(模組重用)
因此if __name__=='__main__':的作用就是控制這兩種情況執行**的過程,__name__是內建變數,用於表示當前模組的名字
(如果當前的檔案作為程式直接執行,那麼此時它的__name__就是__main)也就是說
在if __name__=='__main__':下的**只有在檔案作為程式直接執行時才會執行,而import到其他程式中是不會執行的
在windows上,子程序會自動import啟動它的這個檔案,而在import的時候是會執行這些語句的,如果不加if __name__=='__main__':
的話就會無線遞迴建立子程序,所以必須把建立子程序的部分用那個if判斷保護起來
import的時候如果__name__不是__main__,就不會遞迴執行了
'''
—p.start() 啟動程序,並呼叫該子程序中的p.run()
—p.run() 程序啟動時執行的方法,正是它去呼叫target指定的函式
—p.terminate() 強制終止程序p,不會進行任何清理操作(了解即可)
程序強制終止後,程序物件仍然存在,但是此時你卻不能調(因為已經強制終止了,不能再用start()了),此時的程序物件也被稱為殭屍程序。
例如:如果程式有個限制:程序1執行完後才能執行程序2,此時把程序1強制終止,那麼程序2永遠也不能執行了。
—p.is_alive() 如果p仍然執行,返回true.用來判斷程序是否還在執行
—p.join([timeout]):主程序等待p終止,timeout是可選的超時時間
name:當前程序例項別名,預設為pricess-n,n為從1開始遞增的整數;
pid:當前程序例項的pid值(也就是當前的乙個程序號)(只要有乙個程序執行,系統就會給它分配乙個pid,是系統用來分辨不同的程序用的)
from multiprocessing import process
num=1
def run1():
global num
num+=5
print("子程序1執行中,num=%d"%num)
def run2():
global num
num+=10
print("子程序2執行中,num=%d"%num)
if __name__ == '__main__':
print("主程序啟動")
p1=process(target=run1)
p2=process(target=run2)
print("子程序將要執行")
p1.start()
p2.start()
p1.join()
p2.join()
print("子程序結束")
#執行結果
主程序啟動
子程序將要執行
子程序1執行中,num=6
子程序2執行中,num=11
子程序結束
1
建立新的程序還能夠使用類的方式,可以自定義乙個類,繼承process類,每次例項化這個類的時候,就等同於例項化乙個程序物件.
import multiprocessing,time
class clockprocess (multiprocessing.process):
def run(self):#重寫run()方法
n=5while n>0:
print(n)
time.sleep(1)
n-=1
if __name__ == '__main__':
p=clockprocess()
p.start()#啟動程序並呼叫run()方法
p.join()
當需要建立的⼦程序數量不多時, 可以直接利⽤multiprocessing中的process動態生成多個程序, 但如果是上百甚⾄上千個⽬標,⼿動的去建立程序的⼯作量巨⼤,此時就可以⽤到multiprocessing模組提供的pool
初始化pool時,可以指定⼀個最⼤程序數,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立⼀個新的程序⽤來執⾏該請求,但如果池中的程序數已經達到指定的最⼤值,那麼該請求就會等待,直到池中有程序結束才會建立新的程序來執⾏.
from multiprocessing import pool
import random,time
def work(num):
print(random.random()*num)
time.sleep(3)
if __name__ == '__main__':
po=pool(3)#定義乙個程序池,最大程序數為3 預設大小為cpu核數
for i in range(10):
po.close()#程序池關閉之後不再接受新的請求
po.join()#等待po中所有子程序結束,語法規定:必須放在close後面
#在多程序中,主程序一般用來等待,真正的任務都在子程序中執行
–close():關閉pool,使其不再接受新的任務;
–terminate():不管任務是否完成,⽴即終⽌;
join():主程序阻塞,等待⼦程序的退出, 必須在close或terminate之後 使⽤;
python中的多程序
import multiprocessing import time deffunc arg pname multiprocessing.current process name pid multiprocessing.current process pid print 當前程序id d,name ...
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序的坑 Python多程序相關的坑
python的multiprocessing模組實現了多程序功能,但官方文件上只有一些比較簡單的用法,主要是使用函式作為process的target,而如何在class中使用多程序並沒有多講解。google出兩篇比較詳細的文章,建議從它們入門 下面記錄一下自己這週在python多程序上碰到的坑 建立...