Python多进程编程常用方法解析


Posted in Python onMarch 26, 2020

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程。python提供了非常好用的多进程包Multiprocessing,只需要定义一个函数,python会完成其它所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、LocK等组件

一、Process

语法:Process([group[,target[,name[,args[,kwargs]]]]])

参数含义:target表示调用对象;args表示调用对象的位置参数元祖;kwargs表示调用对象的字典。name为别名,groups实际上不会调用。

方法:is_alive():

 join(timeout):

 run():

 start():

 terminate():

属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为-N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新的进程,必须在start()之前设置。

1.创建函数,并将其作为单个进程

from multiprocessing import Process
def func(name):
 print("%s曾经是好人"%name)
if __name__ == "__main__":
 p = Process(target=func,args=('kebi',))
 p.start() #start()通知系统开启这个进程

2.创建函数并将其作为多个进程

from multiprocessing import Process
import random,time

def hobby_motion(name):
 print('%s喜欢运动'% name)
 time.sleep(random.randint(1,3))

def hobby_game(name):
 print('%s喜欢游戏'% name)
 time.sleep(random.randint(1,3))

if __name__ == "__main__":
 p1 = Process(target=hobby_motion,args=('付婷婷',))
 p2 = Process(target=hobby_game,args=('科比',))
 p1.start()
 p2.start()

执行结果:

付婷婷喜欢运动
科比喜欢游戏

3.将进程定义为类(开启进程的另一种方法,并不是很常用)

from multiprocessing import Process
class MyProcess(Process):
 def __init__(self,name):
 super().__init__()
 self.name = name
 def run(self): #start()时,run自动调用,而且此处只能定义为run。
 print("%s曾经是好人"%self.name)
if __name__ == "__main__":
 p = MyProcess('kebi')
 p.start() #将Process当作父类,并且自定义一个函数。

4.daemon程序对比效果

不加daemon属性

import time
def func(name):
 print("work start:%s"% time.ctime())
 time.sleep(2)
 print("work end:%s"% time.ctime())

if __name__ == "__main__":
 p = Process(target=func,args=('kebi',))
 p.start()
 print("this is over")
#执行结果
this is over
work start:Thu Nov 30 16:12:00 2017
work end:Thu Nov 30 16:12:02 2017

加上daemon属性

from multiprocessing import Process
import time
def func(name):
 print("work start:%s"% time.ctime())
 time.sleep(2)
 print("work end:%s"% time.ctime())

if __name__ == "__main__":
 p = Process(target=func,args=('kebi',))
 p.daemon = True #父进程终止后自动终止,不能产生新进程,必须在start()之前设置
 p.start()
 print("this is over")

#执行结果
this is over

设置了daemon属性又想执行完的方法:

import time
def func(name):
 print("work start:%s"% time.ctime())
 time.sleep(2)
 print("work end:%s"% time.ctime())

if __name__ == "__main__":
 p = Process(target=func,args=('kebi',))
 p.daemon = True
 p.start()
 p.join() #执行完前面的代码再执行后面的
 print("this is over")

#执行结果
work start:Thu Nov 30 16:18:39 2017
work end:Thu Nov 30 16:18:41 2017
this is over

5.join():上面的代码执行完毕之后,才会执行后i面的代码。

先看一个例子:

from multiprocessing import Process
import time,os,random
def func(name,hour):
 print("A lifelong friend:%s,%s"% (name,os.getpid()))
 time.sleep(hour)
 print("Good bother:%s"%name)
if __name__ == "__main__":
 p = Process(target=func,args=('kebi',2))
 p1 = Process(target=func,args=('maoxian',1))
 p2 = Process(target=func,args=('xiaoniao',3))
 p.start()
 p1.start()
 p2.start()
 print("this is over")

执行结果:

this is over #最后执行,最先打印,说明start()只是开启进程,并不是说一定要执行完
A lifelong friend:kebi,12048
A lifelong friend:maoxian,8252
A lifelong friend:xiaoniao,6068
Good bother:maoxian #最先打印,第二位执行
Good bother:kebi
Good bother:xiaoniao

添加join()

from multiprocessing import Process
import time,os,random
def func(name,hour):
 print("A lifelong friend:%s,%s"% (name,os.getpid()))
 time.sleep(hour)
 print("Good bother:%s"%name)
start = time.time()
if __name__ == "__main__":
 p = Process(target=func,args=('kebi',2))
 p1 = Process(target=func,args=('maoxian',1))
 p2 = Process(target=func,args=('xiaoniao',3))
 p.start()
 p.join() #上面的代码执行完毕之后,再执行后面的
 p1.start()
 p1.join()
 p2.start()
 p2.join()
 print("this is over")
 print(time.time() - start)
#执行结果
A lifelong friend:kebi,14804
Good bother:kebi
A lifelong friend:maoxian,11120
Good bother:maoxian
A lifelong friend:xiaoniao,10252 #每个进程执行完了,才会执行下一个
Good bother:xiaoniao
this is over
6.497815370559692 #2+1+3+主程序执行时间

改变一下位置

from multiprocessing import Process
import time,os,random
def func(name,hour):
 print("A lifelong friend:%s,%s"% (name,os.getpid()))
 time.sleep(hour)
 print("Good bother:%s"%name)
start = time.time()
if __name__ == "__main__":
 p = Process(target=func,args=('kebi',2))
 p1 = Process(target=func,args=('maoxian',1))
 p2 = Process(target=func,args=('xiaoniao',3))
 p.start()
 p1.start()
 p2.start()
 p.join() #需要2秒
 p1.join() #到这时已经执行完
 p2.join() #已经执行了2秒,还要1秒
 print("this is over")
 print(time.time() - start)
#执行结果
A lifelong friend:kebi,13520
A lifelong friend:maoxian,11612
A lifelong friend:xiaoniao,17064 #几乎是同时开启执行
Good bother:maoxian
Good bother:kebi
Good bother:xiaoniao
this is over
3.273620367050171 #以最长时间的为主

6.其它属性和方法

from multiprocessing import Process
import time
def func(name):
 print("work start:%s"% time.ctime())
 time.sleep(2)
 print("work end:%s"% time.ctime())

if __name__ == "__main__":
 p = Process(target=func,args=('kebi',))
 p.start()
 p.terminate() #将进程杀死,而且必须放在start()后面,与daemon的功能类似

#执行结果
this is over
from multiprocessing import Process
import time
def func(name):
 print("work start:%s"% time.ctime())
 time.sleep(2)
 print("work end:%s"% time.ctime())

if __name__ == "__main__":
 p = Process(target=func,args=('kebi',))
 # p.daemon = True
 print(p.is_alive())
 p.start()
 print(p.name) #获取进程的名字
 print(p.pid) #获取进程的pid
 print(p.is_alive()) #判断进程是否存在
 print("this is over")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python爬取国外天气预报网站的方法
Jul 10 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
python实现学生管理系统
Jan 11 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
python ssh 执行shell命令的示例
Sep 29 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
用python发送微信消息
Dec 21 Python
Python find()、rfind()方法及作用
Dec 24 Python
简单了解python调用其他脚本方法实例
Mar 26 #Python
Python tornado上传文件的功能
Mar 26 #Python
Python Tornado批量上传图片并显示功能
Mar 26 #Python
python列表删除和多重循环退出原理详解
Mar 26 #Python
执行Python程序时模块报错问题
Mar 26 #Python
python3 正则表达式基础廖雪峰
Mar 25 #Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 #Python
You might like
php 获取本地IP代码
2013/06/23 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
原生JS轮播图插件
2017/02/09 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
Python 命令行参数sys.argv
2008/09/06 Python
python友情链接检查方法
2015/07/08 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
Python常用特殊方法实例总结
2019/03/22 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
人事主管岗位职责说明书
2014/07/30 职场文书
公司总经理岗位职责
2015/04/01 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
优质护理服务心得体会
2016/01/22 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB