1. 程式人生 > >python 多程序及多執行緒

python 多程序及多執行緒

本人用的是window系統,所以就基於Windows系統來講解python多程序的問題。

由於Windows不同於Linux系統,所以在使用多程序時需要匯入multiprocessing模組,模組提供了一個Process類來代表一個程序物件:

from multiprocessing import Process
import os

def Solution(name):
    print("Run child process {0} {1}".format(name, os.getpid()))

if __name__ == "__main__":
    print('Parent process {0}'.format(os.getpid()))
    p = Process(target=Solution, args=('test',))
    print("child process will start:")
    p.start()
    p.join()
    print('child process end')

結果執行如下:

Parent process 7304
child process will start:
Run child process test 9668
child process end

 程式碼分析:

1. 首先我們匯入需要用到的multiprocessing模組跟os模組,然後建立一個用於測試的函式  Solution(),這個函式的作用只是列印一句話,來提示我們子程序已經正常工作了,子程序的  name  是通過主函式呼叫時傳入的,os.getpid() 函式用於獲取程序 ID,這個ID是系統在程序開闢的時候賦予的。

2. 主程式裡面:首先列印 主程序的 ID,這個ID是區別於子程序ID的;然後利用 Process()方法建立子程序,

Process([group [, target [, name [, args [, kwargs]]]]])

這是Process方法的定義:

  • group 分組,基本不會使用
  • target 表示需要呼叫的函式方法,在這裡我們呼叫函式Solution
  • args 表示需要傳給呼叫物件即Solution的引數,需要以元組的形式傳入,在這裡我們只傳入一個 ‘test’ 引數,由於是元組形式,所以需要為(‘test',)否則直譯器會把引數當成一個括號裡面的元素

3 . 建立完子程序之後,我們先列印一句話,來提示子程序即將開始執行。

  • p.start()方法表示子程序開始執行
  • p.join()方法表示子程序結束之後,主程序才繼續執行主函式之後的程式碼,如果不去呼叫  join()方法,極有可能會造成殭屍程式,即主程式已經結束了,但是子程式還在繼續執行,繼續消耗電腦資源

這是建立一個單子程序的方法,假如說我們需要建立多個子程序怎麼辦?這時候我們就可以使用程序池來批量建立子程序

from multiprocessing import Pool
import os
import time
import random

def Solution(name):
    print('執行子程序 {0},程序ID:{1}'.format(name,os.getpid()))
    start = time.time()
    time.sleep(random.random() * 2)
    end = time.time()
    print('子程序{0}執行時間:{1}'.format(name,(end-start)))

if __name__ == "__main__":
    print("主程序ID:{0}".format(os.getpid()))
    p = Pool(processes=4)
    for i in range(5):
        p.apply_async(Solution, args= (i,))
    print("請稍等:")
    p.close()
    p.join()
    print("所有程序已結束!")
  • 首先我們匯入需要用到的庫,multiprocessing用於建立多程序, os 用於獲取程序的ID號,time 模組用於計算各個子程序的執行時間,random模組用於隨機產生一個數字,然後讓子程序進入休眠,即子程序的主要任務:睡覺
  • 構造一個函式Solution():在裡面首先列印子程序的名字以及ID號、start記錄程序開始的時間、然後子程序進入休眠,時間隨機。end記錄程序結束的時間。最後列印子程序執行時間及name
  • 主程式:首先列印主程序Id號。利用程序池 Pool 建立四個程序0、1、2、3、5 。利用for 迴圈呼叫子程序,相當於單步進行上面的單子程序。列印  “請稍等:”  。呼叫 close()方法,來關閉程序池,關閉之後就不能繼續新增新的子程序了。呼叫join()方法。列印結果

下面是執行結果

主程序ID:6416
請稍等:
執行子程序 0,程序ID:13388
執行子程序 1,程序ID:6208
執行子程序 2,程序ID:6340
執行子程序 3,程序ID:10352
子程序3執行時間:0.05106353759765625
執行子程序 4,程序ID:10352
子程序2執行時間:0.08306264877319336
子程序0執行時間:0.13808250427246094
子程序4執行時間:0.39206528663635254
子程序1執行時間:1.932739496231079
所有程序已結束!

  我們觀察一下結果,程序0、1、2、3是立即執行,但是程序4是在某個程序執行結束之後才開始進行的,只是因為我的 Pool的大小預設為4