首页 > 编程 > Python > 正文

Python多进程multiprocessing用法实例分析

2020-02-16 02:05:44
字体:
来源:转载
供稿:网友

本文实例讲述了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)            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表