python Multiprocessing 多進程應用

在運維工做中,常常要處理大量數據,或者要跑一些時間比較長的任務,可能都須要用到多進程,無論是管理端下發任務,仍是客戶端執行任務,若是服務器配置還能夠,跑多進程仍是挺能解決問題的python

Multiprocessing Pool

若是任務須要啓動大量子進程,用一下multiprocessing Pool 是比較好的,相似以下用法服務器

#!/usr/bin/env python # coding:utf8 #author:shantuwqk@163.com from multiprocessing import Pool import os,time,random def task_exec_time(name): print 'Run task %s(%s)....' %(name,os.getpid()) start = time.time() time.sleep(random.random()*3) end = time.time() print 'Task %s runs %0.2f seconds.' %(name,(end - start)) if __name__ == '__main__': print 'Parent process %s.' %os.getpid() p = Pool(8) for i in xrange(50): p.apply_async(task_exec_time,args=(i,)) print 'Waitting for all subprocesses done....' p.close() p.join() print 'All subprocess done...' 

multiprocessing Queue

啓動進程後,若是須要進程間進行數據交換。用Queue,或pipesapp

#!/usr/bin/env python # coding:utf8 #author:shantuwqk@163.com from multiprocessing import Process,Queue import time,sys,random,os def task_write(q): for i in xrange(50): print 'Put %s to queue....' %i q.put(i) time.sleep(1) def task_read(q): while True: result = q.get(True) print 'Get %s from queue.' %result if __name__ == "__main__": #父進程建立Queue,並傳給各個子進程: q = Queue() qw = Process(target=task_write,args=(q,)) qr = Process(target=task_read,args=(q,)) # 啓動子進程pw,寫入 qw.start() # 啓動子進程pr,讀取: qr.start() # 等待pw結束: qw.join() # pr進程裏是死循環,沒法等待其結束,只能強行終止: terminate qr.terminate() 

小結:運維

在Unix/Linux下,能夠使用fork()調用實現多進程。dom

要實現跨平臺的多進程,能夠使用multiprocessing模塊。async

進程間通訊是經過Queue、Pipes等實現的。spa

相關文章
相關標籤/搜索