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编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
配置python的编程环境之Anaconda + VSCode的教程
Mar 29 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 Python
Pandas实现一列数据分隔为两列
May 18 Python
python中可以声明变量类型吗
Jun 18 Python
python实现三次密码验证的示例
Apr 29 Python
python神经网络 使用Keras构建RNN训练
May 04 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
url decode problem 解决方法
2011/12/26 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
浅谈php命令行用法
2015/02/04 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
2018/10/29 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
Python and、or以及and-or语法总结
2015/04/14 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python3实现购物车功能
2018/04/18 Python
python 读入多行数据的实例
2018/04/19 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
应届毕业生个人自荐信范文
2013/11/30 职场文书
四好少年事迹材料
2014/01/12 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS