python使用多进程的实例详解


Posted in Python onSeptember 19, 2018

python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势。

针对计算密集型场景需要使用多进程,python的multiprocessing与threading模块非常相似,支持用进程池的方式批量创建子进程。

•创建单个Process进程(使用func)

只需要实例化Process类,传递函数给target参数,这点和threading模块非常的类似,args为函数的参数

import os
from multiprocessing import Process
# 子进程要执行的代码
def task(name):
  print('run child process %s (%s)...' % (name, os.getpid()))
if __name__ == '__main__':
  print('parent process %s.' % os.getpid())
  p = Process(target=task, args=('test',))
  p.start()
  p.join()
  print('process end.')

•创建单个Process进程(使用class)

继承Process类,重写run方法创建进程,这点和threading模块基本一样

import multiprocessing
import os
from multiprocessing import current_process
class Worker(multiprocessing.Process):
  def run(self):
    name = current_process().name # 获取当前进程的名称
    print('run child process <%s> (%s)' % (name, os.getpid()))
    print('In %s' % self.name)
    return
if __name__ == '__main__':
  print('parent process %s.' % os.getpid())
  p = Worker()
  p.start()
  p.join()
  print('process end.') 
* 停止进程

terminate()结束子进程,但是会导致子进程的资源无法释放掉,是不推荐的做法,因为结束的时候不清楚子线程的运行状况,有很大可能性导致子线程在不恰当的时刻被结束。

import multiprocessing
import time
def worker():
  print('starting worker')
  time.sleep(0.1)
  print('finished worker')
if __name__ == '__main__':
  p = multiprocessing.Process(target=worker)
  print('执行前:', p.is_alive())
  p.start()
  print('执行中:', p.is_alive())
  p.terminate() # 发送停止号
  print('停止:', p.is_alive())
  p.join()
  print('等待完成:', p.is_alive())

•直接创建多个Process进程

import multiprocessing
def worker(num):
  print(f'Worker:%s %s', num)
  return
if __name__ == '__main__':
  jobs = []
  for i in range(5):
    p = multiprocessing.Process(target=worker, args=(i,))
    jobs.append(p)
    p.start()

•使用进程池创建多个进程

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

import os
import random
import time
from multiprocessing import Pool
from time import ctime
def task(name):
  print('start task %s (%s)...' % (name, os.getpid()))
  start = time.time()
  time.sleep(random.random() * 3)
  print('end task %s runs %0.2f seconds.' % (name, (time.time() - start)))
if __name__ == '__main__':
  print('parent process %s.' % os.getpid())
  p = Pool() # 初始化进程池
  for i in range(5):
    p.apply_async(task, args=(i,)) # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。
  p.close()
  p.join() # 等待所有结果执行完毕,会等待所有子进程执行完毕,调用join()之前必须先调用close()
  print(f'all done at: {ctime()}')

如果关心每个进程的执行结果,可以使用返回结果的get方法获取,代码如下

import os
import random
import time
from multiprocessing import Pool, current_process
from time import ctime
def task(name):
  print('start task %s (%s)...' % (name, os.getpid()))
  start = time.time()
  time.sleep(random.random() * 3)
  print('end task %s runs %0.2f seconds.' % (name, (time.time() - start)))
  return current_process().name + 'done'
if __name__ == '__main__':
  print('parent process %s.' % os.getpid())
  result = []
  p = Pool() # 初始化进程池
  for i in range(5):
    result.append(p.apply_async(task, args=(i,))) # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。
  p.close()
  p.join() # 等待所有结果执行完毕
  for res in result:
    print(res.get()) # get()函数得出每个返回结果的值
  print(f'all done at: {ctime()}')

总结

以上所述是小编给大家介绍的python使用多进程的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python Trie树实现字典排序
Mar 28 Python
Python列表生成器的循环技巧分享
Mar 06 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 Python
python mysql断开重连的实现方法
Jul 26 Python
softmax及python实现过程解析
Sep 30 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
用基于python的appium爬取b站直播消费记录
Apr 17 Python
python关于集合的知识案例详解
May 30 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 #Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 #Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 #Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 #Python
win10下tensorflow和matplotlib安装教程
Sep 19 #Python
Python爬虫常用库的安装及其环境配置
Sep 19 #Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 #Python
You might like
php PDO中文乱码解决办法
2009/07/20 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
简单的三步vuex入门
2018/05/20 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
python算法学习之计数排序实例
2013/12/18 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
python用Configobj模块读取配置文件
2020/09/26 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
自荐书模板
2013/12/19 职场文书
党校培训思想汇报
2013/12/30 职场文书
医院护士的求职信
2014/01/03 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
主题教育活动总结
2014/05/05 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书