Python 多進程

由於 GIL (Global Interpreter Lock,全局解釋器鎖) 的關係,python中的多線程其實並非真正的多線程,想要充分地使用多核CPU的資源,在python中大部分狀況須要使用多進程。
使用多進程時,應注意如下幾點:html

  • 在UNIX平臺上,當某個進程終結以後,該進程須要被其父進程調用wait,不然進程成爲殭屍進程(Zombie)。因此,有必要對每一個Process對象調用join()方法 (實際上等同於wait)。對於多線程來講,因爲只有一個進程,因此不存在此必要性。
  • multiprocessing提供了threading包中沒有的 IPC (好比Pipe和Queue),效率上更高。應優先考慮Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (由於它們佔據的不是用戶進程的資源)。
  • 多進程應該避免共享資源。在多線程中,咱們能夠比較容易地共享資源,好比使用全局變量或者傳遞參數。在多進程狀況下,因爲每一個進程有本身獨立的內存空間,以上方法並不合適。此時咱們能夠經過共享內存和Manager的方法來共享資源。但這樣作提升了程序的複雜度,並由於同步的須要而下降了程序的效率。
  • Process.PID中保存有PID,若是進程尚未start(),則PID爲None。
  • window系統下,須要注意的是要想啓動一個子進程,必須加上那句if __ name __ == "main",進程相關的要寫在這句下面。

如何建立多進程

方式一python

from multiprocessing import Process
import time

def f(name):
    time.sleep(1)
    print('hello', name,time.ctime())

if __name__ == '__main__':
    p_list = []
    for i in range(3):
        p = Process(target=f, args=('alvin',))
        p_list.append(p)
        p.start()
    for i in p_list:
        p.join()

    print('end')

運行結果:
hello alvin Sun Aug 12 09:34:42 2018
hello alvin Sun Aug 12 09:34:42 2018
hello alvin Sun Aug 12 09:34:42 2018
end

方式二:多線程

from multiprocessing import Process
import time

class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()

    def run(self):
        time.sleep(1)
        print('hello', self.name,time.ctime())

if __name__ == '__main__':
    p_list=[]
    for i in range(3):
        p = MyProcess()
        p.start()
        p_list.append(p)
    for p in p_list:
        p.join()

    print('end')

運行結果:
hello MyProcess-1 Sun Aug 12 09:45:07 2018
hello MyProcess-2 Sun Aug 12 09:45:07 2018
hello MyProcess-3 Sun Aug 12 09:45:07 2018
end

獲取程序的父進程和子進程

from  multiprocessing import Process
import os, time

def info(title):
    print(title)
    print('module name: ', __name__)
    print('parent process: ', os.getppid())
    print('process id: ', os.getpid())

def f(name):
    info('\033[31;1mfunction f\033[0m')
    print('hello', name)

if __name__ == '__main__':
    info('\033[32;1mmain process line \033[0m')
    time.sleep(100)
    p = Process(target=info, args=('bob',))
    p.start()
    p.join()

運行結果:
main process line 
module name:  __main__
parent process:  12248
process id:  1956

參考: http://www.cnblogs.com/yuanchenqi/articles/5745958.htmlapp

相關文章
相關標籤/搜索