前言:
python多進程,經常在使用,卻沒有怎么系統的學習過,官網上面講得比較細,結合自己的學習,整理記錄下官網:https://docs.python.org/3/library/multiprocessing.html
multiprocessing簡介
multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務器為多核CPU時效果更好,類似于threading模塊。相對于多線程,多進程由于獨享內存空間,更穩定安全,在運維里面做些批量操作時,多進程有更多適用的場景
multiprocessing包提供了本地和遠程兩種并發操作,有效的避開了使用子進程而不是全局解釋鎖的線程,因此,multiprocessing可以有效利用到多核處理
Process類
在multiporcessing中,通過Process類對象來批量產生進程,使用start()方法來啟動這個進程
1.語法
multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*)
group: 這個參數一般為空,它只是為了兼容threading.Tread target: 這個參數就是通過run()可調用對象的方法,默認為空,表示沒有方法被調用 name: 表示進程名 args: 傳給target調用方法的tuple(元組)參數 kwargs: 傳給target調用方法的dict(字典)參數2.Process類的方法及對象
run()
該方法是進程的運行過程,可以在子類中重寫此方法,一般也很少去重構
start()
啟動進程,每個進程對象都必須被該方法調用
join([timeout])
等待進程終止,再往下執行,可以設置超時時間
name
可以獲取進程名字,多個進程也可以是相同的名字
is_alive()
返回進程是否還存活,True or False,進程存活是指start()開始到子進程終止
daemon
守護進程的標記,一個布爾值,在start()之后設置該值,表示是否后臺運行
注意:如果設置了后臺運行,那么后臺程序不運行再創建子進程
pid
可以獲取進程ID
exitcode
子進程退出時的值,如果進程還沒有終止,值將是None,如果是負值,表示子進程被終止
terminate()
終止進程,如果是Windows,則使用terminateprocess(),該方法對已經退出和結束的進程,將不會執行
以下為一個簡單的例子:
#-*- coding:utf8 -*- import multiprocessingimport timedef work(x): time.sleep(1) print time.ctime(),'這是子進程[{0}]...'.format(x)if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=work,args=(i,)) print '啟動進程數:{0}'.format(i) p.start() p.deamon = True
當然也可以顯示每個進程的ID
#-*- coding:utf8 -*- import multiprocessingimport timeimport osdef work(x): time.sleep(1) ppid = os.getppid() pid = os.getpid() print time.ctime(),'這是子進程[{0},父進程:{1},子進程:{2}]...'.format(x,ppid,pid)if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=work,args=(i,)) print '啟動進程數:{0}'.format(i) p.start() p.deamon = True
新聞熱點
疑難解答