本文實例講述了Python多進程multiprocessing用法。分享給大家供大家參考,具體如下:
mutilprocess簡介
像線程一樣管理進程,這個是mutilprocess的核心,他與threading很是相像,對多核CPU的利用率會比threading好的多。
簡單的創建進程:
import multiprocessingdef worker(num): """thread worker function""" print 'Worker:', num returnif __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start()
確定當前的進程,即是給進程命名,方便標識區分,跟蹤
import multiprocessingimport timedef worker(): name = multiprocessing.current_process().name print name, 'Starting' time.sleep(2) print name, 'Exiting'def my_service(): name = multiprocessing.current_process().name print name, 'Starting' time.sleep(3) print name, 'Exiting'if __name__ == '__main__': service = multiprocessing.Process(name='my_service', target=my_service) worker_1 = multiprocessing.Process(name='worker 1', target=worker) worker_2 = multiprocessing.Process(target=worker) # default name worker_1.start() worker_2.start() service.start()
守護進程就是不阻擋主程序退出,自己干自己的 mutilprocess.setDaemon(True)就這句等待守護進程退出,要加上join,join可以傳入浮點數值,等待n久就不等了
守護進程:
import multiprocessingimport timeimport sysdef daemon(): name = multiprocessing.current_process().name print 'Starting:', name time.sleep(2) print 'Exiting :', namedef non_daemon(): name = multiprocessing.current_process().name print 'Starting:', name print 'Exiting :', nameif __name__ == '__main__': d = multiprocessing.Process(name='daemon', target=daemon) d.daemon = True n = multiprocessing.Process(name='non-daemon', target=non_daemon) n.daemon = False d.start() n.start() d.join(1) print 'd.is_alive()', d.is_alive() n.join()
最好使用 poison pill,強制的使用terminate()注意 terminate之后要join,使其可以更新狀態
終止進程:
import multiprocessingimport timedef slow_worker(): print 'Starting worker' time.sleep(0.1) print 'Finished worker'if __name__ == '__main__': p = multiprocessing.Process(target=slow_worker) print 'BEFORE:', p, p.is_alive() p.start() print 'DURING:', p, p.is_alive() p.terminate() print 'TERMINATED:', p, p.is_alive() p.join() print 'JOINED:', p, p.is_alive()
①. == 0 未生成任何錯誤
②. 0 進程有一個錯誤,并以該錯誤碼退出
③. < 0 進程由一個-1 * exitcode信號結束
進程的退出狀態:
import multiprocessingimport sysimport timedef exit_error(): sys.exit(1)def exit_ok(): returndef return_value(): return 1def raises(): raise RuntimeError('There was an error!')def terminated(): time.sleep(3)if __name__ == '__main__': jobs = [] for f in [exit_error, exit_ok, return_value, raises, terminated]: print 'Starting process for', f.func_name j = multiprocessing.Process(target=f, name=f.func_name) jobs.append(j) j.start() jobs[-1].terminate() for j in jobs: j.join() print '%15s.exitcode = %s' % (j.name, j.exitcode)
新聞熱點
疑難解答