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 爬虫爬取指定博客的所有文章
Feb 17 Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
python查看微信好友是否删除自己
Dec 19 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
Python Web版语音合成实例详解
Jul 16 Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
pycharm2021激活码使用教程(永久激活亲测可用)
Mar 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
php图片裁剪函数
2018/10/31 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
Python基础篇之初识Python必看攻略
2016/06/23 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
Python如何给函数库增加日志功能
2020/08/04 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
大学生活学习的自我评价
2013/12/03 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
体育口号大全
2014/06/18 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
事业单位年度考核评语
2014/12/31 职场文书
安全教育片观后感
2015/06/17 职场文书
运动会新闻稿
2015/07/17 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书