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读取html中指定元素生成excle文件示例
Apr 03 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Python中扩展包的安装方法详解
Jun 14 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
python中threading和queue库实现多线程编程
Feb 06 Python
Python学习之包与模块详解
Mar 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
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
form自动提交实例讲解
2017/07/10 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
Python计算已经过去多少个周末的方法
2015/07/25 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
python读写csv文件实例代码
2019/07/05 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python类super()及私有属性原理解析
2020/06/15 Python
python 如何上传包到pypi
2020/12/24 Python
python 如何在测试中使用 Mock
2021/03/01 Python
static函数与普通函数有什么区别
2015/12/25 面试题
英语一分钟演讲稿
2014/04/29 职场文书
优秀英文求职信范文
2015/03/19 职场文书
应收账款管理制度
2015/08/06 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL