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使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
详解Python字典的操作
Mar 04 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
php读取xml实例代码
2010/01/28 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
Firefox div高度自适应
2009/04/28 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
2020/03/07 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python代码实现猜拳小游戏
2020/11/30 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
平面设计岗位职责
2013/12/14 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
新书吧创业计划书
2014/01/31 职场文书
高中军训感言800字
2014/03/05 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫