1. 程式人生 > >用multiprocessing模組建立程序, 建立自定以程序 ,和程序池技術

用multiprocessing模組建立程序, 建立自定以程序 ,和程序池技術

  • olmultiprocessing 模組建立程序

    1.需要將要執行的事情封裝為函式
    2.使用moltiprocessing模組中Process類建立程序物件
    3.通過物件屬性設定和Process的初始化函式對程序進行設定,繫結要執行的函式
    4.啟動程序,會自動執行程序繫結的函式
    5.完成程序的回收

Process()
    功能:建立程序物件
    引數:name 程序名稱  Process-1
             target 繫結函式
             args 元組 給target函式按照位置傳參
             kwargs 字典 給target函式按照鍵值對傳參

p.start()
    功能:啟動程序
    *target函式會自動執行,此時程序真正被建立
p.join([timeout])
    功能:等待回收子程序
    引數:超時時間

    *使用multiprocessing建立子程序,同樣子程序複製父程序的全部程式碼段
    父子程序各自執行互不影響,父子程序有各自的執行空間

    *如果不使用join回收子程序則子程序退出後會成為殭屍程序

    *使用multiprocessing建立子程序往往父程序只是用來建立程序回收程序
注意:
    1.如果子程序從父程序拷貝物件,物件和網路或者檔案相關聯,那麼父子程序會使用同一套物件屬性,相互有一定的關聯性
    2.如果在子程序中單獨建立物件,則和父程序完全沒有關聯

# process1.py

from multiprocessing import Process
from time import sleep


# 帶引數的程序函式
def worker(sec, name):
    for i in range(3):
        sleep(sec)
        print("I'm %s" % name)
        print("I'm working ..      ..")
p = Process(target = worker, args = (1, 'zhuli'), name = 'shuijun')

p.start()
print('Process name:', p.name)  # 程序名稱
print('Process PID', p.pid)     # 獲取程序pid號
print('Process is alive:', p.is_alive())  # 程序alive情況
p.join()


#  結果為:
#  Process name: shuijun
#  Process PID 60903
#  Process is alive: True
#  I'm zhuli
#  I'm working ....
#  I'm  zhuli
#  I'm working ....
#  I'm zhuli
#  I'm working ....

Process程序物件屬性

    p.start()         啟動程序
    p.join()           回收子程序

    p.is_alive()    判斷程序的生命週期狀態,處於生命週期得到True否則返回False
    p.name          程序名稱  預設為Process-1
    p.pid              程序的PID號
    p.daemon
        預設狀態False  主程序退出不會影響子程序執行
        如果設定為True,則子程序會隨著主程序結束而結束

        *要在srtart 前設定
        *一般不和join一起使用

  • 建立自定義程序類

    1.繼承Process
    2.編寫自己的__init__,同時載入父類的__init__方法
    3.重寫run方法,通過生成的物件呼叫start自動執行

# clock.py
from multiprocessing import Process
import time

class ClockProcess(Process):
    def __init__(self,value):
        self.value = value
        super().__init__()

    # 重寫run方法
    def run(self):
        for i in range(5):
            print('The time is {}'.format(time.ctime()))
            time.sleep(self.value)


# 建立自定義程序類的物件
p = ClockProcess(2)
# 自動呼叫run
p.start()
p.join()

多程序
    優點:可以使用計算機多核,進行任務的併發執行,提高執行效率
        空間獨立,資料安全
        執行不受其他程序影響,建立方便
    缺點:程序的建立和消耗的系統資源較多

程序池技術
    產生原因:如果有大量任務需要多程序完成,則可能需要頻繁的建立刪除程序,給
                     計算機帶來較多的資源消耗

    原理:建立適當的程序放入程序池,用來處理待處理事件,處理完畢之後程序不銷燬,
             仍然在程序池中等待處理其他事件.程序的複用降低了資源的消耗

    使用方法:
        1.建立程序池,在池內放入適當的程序(4-8個)
        2.將事件加入到程序池等待佇列
        3.事件不斷取程序執行事件,直到所有事件執行完畢
        4.關閉程序池,回收程序

    Pool(process)
    功能:建立程序池物件
    引數:表示程序池中有多少個程序

    pool.apply_async(func,args,kwargs)
    功能:將事件放入到程序池佇列
    引數:func      事件函式
             args       以元組形式給func傳參
             kwargs  以字典形式給func傳參
    返回值:返回一個代表程序池物件
    pool.close()
    功能:o閉程序池

    pool.join()
    功能:回收程序池


    pool.map(func,iter)
    功能:將要做的事件放入程序池
    引數:func 要執行的函式
             iter    迭代物件
    返回值: 返回事件函式的返回值列表

# pool.py
from multiprocessing import Pool
from time import sleep,ctime


def worker(msg):
    sleep(2)
    print(msg)
    return ctime()

# 建立程序池
pool = Pool(processes = 4)  # 建立4個程序池
result = []
for i in range(10):
    msg = 'hello %d' % i
    # 將事件放入程序池對列中等待執行
    r = pool.apply_async(func = worker, args = (msg,))
    result.append(r)
# 關閉程序池
pool.close()
# 回收程序池
pool.join()
for i in result:
    print(i.get())  #獲取事件函式的返回值


# hello 0
# hello 1
# hello 3
# hello 2
# hello 6
# hello 5
# hello 4
# hello 7
# hello 8
# hello 9
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:00 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:02 2018
# Thu Sep 13 20:01:04 2018
# Thu Sep 13 20:01:04 2018