1. 程式人生 > 程式設計 >python 程序的幾種建立方式詳解

python 程序的幾種建立方式詳解

在新建立的子程序中,會把父程序的所有資訊複製一份,它們之間的資料互不影響。

使用os.fork()建立

該方式只能用於Unix/Linux作業系統中,在windows不能用。

import os
# 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以
pid = os.fork()
# 子程序永遠返回0,而父程序返回子程序的ID。
if pid == 0:
  print('子程序')
else:
  print('父程序')

使用Process類類建立

multiprocessing模組提供了一個Process類來代表一個程序物件,下面的例子演示了啟動一個子程序並等待其結束:

from multiprocessing import Process
import time

def test(name,age):
  for i in range(5):
    print("--test--%s\t%d" % (name,age))
    time.sleep(1)
  print("子程序結束")
if __name__ == '__main__':
  p = Process(target=test,args=("aaa",18))
  p.start()
  # 等待程序例項執⾏結束,或等待多少秒;
  p.join() # 等待的最長時間
  print("主程序結束")
"""
輸出結果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子程序結束
主程序結束
"""

join()方法表示主程序等待子程序執行完成後繼續往下執行,如果把join()註釋掉,則主程序開啟子程序後不停頓繼續往下執行,然後等待子程序完成程式結束。

把join()方法註釋掉的結果:

"""
輸出結果:
主程序結束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子程序結束
"""

使用Process子類建立

建立新的程序還能夠使用類的方式,可以自定義一個類,繼承Process類,每次例項化這個類的時候,就等同於例項化一個程序物件,請看下面的例項:

from multiprocessing import Process
import time
import os
class MyProcess(Process):
  def __init__(self):
    # 如果子類要重寫__init__是必須要先呼叫父類的__init__否則會報錯
    # Process.__init__(self)  
    super(MyProcess,self).__init__()
  # 重寫Porcess的run()方法
  def run(self):
    print("子程序(%s)開始執行,父程序(%s)" % (os.getpid(),os.getppid()))
    for i in range(5):
      print("--1--")
      time.sleep(1)
if __name__ == '__main__':
  t_start = time.time()
  p = MyProcess()
  p.start()
  # p.join()
  print("main")
  for i in range(5):
    print("--main--")
    time.sleep(1)

使用程序池Pool建立

當需要建立的子程序數量不多時,可以直接利用multiprocessing中的Process動態成生多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的Pool方法。

初始化Pool時,可以指定一個最大程序數,當有新的請求提交到Pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來執行,請看下面的例項:

from multiprocessing import Pool
import os
import time


def worker(num):
  # for i in range(3):
  print("----pid=%d num=%d---" % (os.getpid(),num))
  time.sleep(1)

if __name__ == '__main__':
  # 定義一個程序池,最大程序數3
  pool = Pool(3)
  for i in range(10):
    print("---%d--" % i)
    # 使用非阻塞方式呼叫func(並行執行),一般用這個。
    # apply堵塞方式必須等待上一個程序退出才能執行下一個程序,用的不多。
    pool.apply_async(worker,(i,))
  # 關閉程序池
  pool.close()
  # 等待所有子程序結束,主程序一般用來等待
  pool.join() # 程序池後面無操作時必須有這句

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。