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 正则式使用心得
May 07 Python
python装饰器深入学习
Apr 06 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
Python转换时间的图文方法
Jul 01 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
python系列 文件操作的代码
Oct 06 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
python 插入日期数据到Oracle实例
Mar 02 Python
Python xlwt模块使用代码实例
Jun 10 Python
python文件读取失败怎么处理
Jun 23 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递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
PHP检测用户语言的方法
2015/06/15 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
javascript document.images实例
2008/05/27 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
js正文内容高亮效果的实现方法
2013/06/30 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
JS中的BOM应用
2018/02/02 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
2020/06/11 Javascript
Python中使用PDB库调试程序
2015/04/05 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
python matlibplot绘制3D图形
2018/07/02 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
python 整数越界问题详解
2019/06/27 Python
Python实现微信机器人的方法
2019/09/06 Python
python实现单机五子棋
2020/08/28 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
实习生自我鉴定范文
2013/12/05 职场文书
先进人物事迹材料
2014/12/29 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL