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利用多进程将大量数据放入有限内存的教程
Apr 01 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
Python在字符串中处理html和xml的方法
Jul 31 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
python 合并多个excel中同名的sheet
Jan 22 Python
Python Pygame实现俄罗斯方块
Feb 19 Python
Python3中最常用的5种线程锁实例总结
Jul 07 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 dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
python输入多行字符串的方法总结
2019/07/02 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
教师实习自我鉴定
2013/12/13 职场文书
农场厂长岗位职责
2013/12/28 职场文书
旅游管理专业生自荐信范文
2014/01/02 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
经理岗位职责
2015/02/02 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
《海上日出》教学反思
2016/02/23 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
使用Springboot实现健身房管理系统
2021/07/01 Java/Android