1. 程式人生 > 實用技巧 >multiprocessing模組-Process

multiprocessing模組-Process

multiprocessing模組-Process

# multiple  多元化的
# processing 程序
# multiprocessing 多元的處理程序的模組

仔細說來,multiprocess不是一個模組而是python中一個操作、管理程序的包。 之所以叫multi是取自multiple的多功能的意思,在這個包中幾乎包含了和程序有關的所有子模組。由於提供的子模組非常多,為了方便大家歸類記憶,我將這部分大致分為四個部分:建立程序部分,程序同步部分,程序池部分,程序之間資料共享。

Process模組是一個建立程序的模組,藉助這個模組,就可以完成程序的建立。

import os
from multiprocessing import Process

def func():
    print(os.getpid(),os.getppid())
#     # pid process id           程序id
#     # ppid parent process id   父程序id
if __name__ == '__main__':
    print('main:',os.getpid(),os.getppid())
    p = Process(target=func)
    p.start()
    
#main: 824 1272
#1508 824
#同時開啟多個子程序
import os
import time
from multiprocessing import Process

def func(name,age):
    print('%s start'%name)
    time.sleep(1)
    print(os.getpid(),os.getppid(),name,age)

if __name__ == '__main__':
    # 只會在主程序中執行的所有的程式碼你寫在name = main下
    print('main :',os.getpid(),os.getppid())
    arg_lst = [('alex',84),('太白', 40),('wusir', 48)]
    for arg in arg_lst:
        p = Process(target=func,args=arg)
        p.start()  # 非同步非阻塞
# join的用法
import os
import time
import random
from multiprocessing import Process

def func(name,age):
    print('傳送一封郵件給%s歲的%s\n'%(age,name))
    time.sleep(random.random())
    print('傳送完畢')

if __name__ == '__main__':
    arg_lst = [('大壯',40),('alex', 84), ('太白', 40), ('wusir', 48)]
    p_lst = []
    for arg in arg_lst:
        p = Process(target=func,args=arg)
        p.start()
        p_lst.append(p)
    for p in p_lst:p.join()
        
    print('所有的郵件已傳送完畢')
#p.join([timeout]):主執行緒等待p終止(強調:是主執行緒處於等的狀態,而p是處於執行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的程序,而不能join住run開啟的程序