Python中的多程序

2021-09-12 16:19:26 字數 4460 閱讀 9300

--編寫完的**,沒有執行時稱為程式,正在執行的**,稱為程序。

--程式是死的(靜態的)程序是活的(動態的)

作業系統輪流讓各個任務交替執行,由於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多程序上碰到的坑 建立...