python process模块的使用简介


Posted in Python onMay 14, 2021

process模块

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

参数介绍:

Process(group=None, target=None, name=None, args=(), kwargs={})
​
1 group——参数未使用,值始终为None
2 target——表示调用对象,即子进程要执行的任务
3 args——表示调用对象的位置参数元组,args=(1,2,'egon',)
4 kwargs——表示调用对象的字典,kwargs={'name':'egon','age':18}
5 name——为子进程的名称

方法介绍:

obj.start():启动进程,并调用该子进程中的obj.run()
obj.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
obj.terminate():强制终止进程obj,不会进行任何清理操作,如果obj创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果obj还保存了一个锁那么也将不会被释放,进而导致死锁
obj.is_alive():如果obj仍然运行,返回True
obj.join([timeout]):主线程等待obj终止(强调:是主线程处于等的状态,而obj是处于运行的状态)。timeout是可选的超时时间,需要强调的是,obj.join只能join住start开启的进程,而不能join住run开启的进程

属性介绍:

obj.daemon:默认值为False,如果设为True,代表obj为后台运行的守护进程,当obj的父进程终止时,obj也随之终止,并且设定为True后,obj不能创建自己的新进程,必须在obj.start()之前设置
obj.name:进程的名称
obj.pid:进程的pid
obj.exitcode:进程在运行时为None、如果为?N,表示被信号N结束(了解即可)
obj.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

1、在python中启动一个子进程

from multiprocessing import Process
import os
​
def func():
    print('这是一个子进程——>进程号:', os.getpid(), '  主进程号:', os.getppid())
​
​
if __name__ == '__main__':
    print('这是主进程——>进程号:', os.getpid(), '  主进程号(pycharm):', os.getppid())
    # 实例化一个子进程对象
    obj = Process(target=func)
    obj.start()     # 执行子进程对象
    print('执行了完了主进程的内容')
​
# 输出
这是主进程——>进程号: 3100   主进程号(pycharm): 6748
执行了完了主进程的内容
这是一个子进程——>进程号: 2392   主进程号: 3100

2、给子进程传递参数

from multiprocessing import Process
import os
​
​
def func(name, age):
    print('这是一个子进程——>进程号:', os.getpid(), '  主进程号:', os.getppid())
    print(f'这是一个子进程——>我的名字是{name},今年{age}')
​
​
if __name__ == '__main__':
    print('这是主进程——>进程号:', os.getpid(), '  主进程号(pycharm):', os.getppid())
    # 实例化一个子进程对象
    obj = Process(target=func, args=('小杨', '18')) # args以元组的形式给子进程func函数传位置参数
                               # kwargs以字典的形式给子进程func函数传关键字参数
                               # kwargs={'name': '小杨', 'age': 18}
    obj.start()     # 执行子进程对象
    print('执行了完了主进程的内容')
    
# 输出
这是主进程——>进程号: 11936   主进程号(pycharm): 3676
执行了完了主进程的内容
这是一个子进程——>进程号: 2996   主进程号: 11936
这是一个子进程——>我的名字是小杨,今年18

3、同时开多个子进程

from multiprocessing import Process
import os
​
​
def func(name, age):
    print(f'这是一个子进程——>进程号:{os.getpid()},主进程号:{os.getppid()},我的名字是{name},今年{age}')
​
​
if __name__ == '__main__':
    print('这是主进程——>进程号:', os.getpid(), '  主进程号(pycharm):', os.getppid())
    count = [('小杨', 18), ('鲍勃', 20), ('艾伦', 55)]
    for lis in count:
        # 实例化一个子进程对象
        obj = Process(target=func, args=lis)   # args以元组的形式给子进程func函数传位置参数
        obj.start()     # 执行子进程对象
    print('执行了完了主进程的内容')
    
# 输出
这是主进程——>进程号: 12632   主进程号(pycharm): 9220
执行了完了主进程的内容
这是一个子进程——>进程号:10048,主进程号:12632,我的名字是小杨,今年18
这是一个子进程——>进程号:16032,主进程号:12632,我的名字是鲍勃,今年20
这是一个子进程——>进程号:12060,主进程号:12632,我的名字是艾伦,今年55

4、join的用法

obj.join([timeout]): 主进程等待子进程obj终止(强调:是主进程处于等的状态,而子进程obj是处于运行的状态)。timeout是可选的超时时间,需要强调的是,obj.join只能join住start开启的进程,而不能join住run开启的进程

多个进程同时运行(注意,子进程的执行顺序不是根据启动顺序决定的)

join——>属于同步阻塞:

同步:在做A事件的时候发起B事件,必须等待B事件结束后才能继续做A事件

阻塞:CPU不工作——>input accept recv recvfrom sleep connect......

start——>属于异步非阻塞:

异步:在做A事件的时候发起B事件,不用等待B事件结束就可以继续A事件

非阻塞:CPU在工作(非输入输出阶段I/O)

from multiprocessing import Process
import random
import time
​
​
def mail(name, age):
    count = random.random()
    print(f'给{age}岁的{name}发了一封邮件!延迟{count}秒')
    time.sleep(count)      # 模拟网络延迟
    """
    多个进程同时运行(注意,子进程的执行顺序不是根据启动顺序决定的)
    """
​
​
if __name__ == '__main__':
    info_list = [('小杨', 18), ('鲍勃', 20), ('艾伦', 55)]
    jo = []
    for info in info_list:
        obj = Process(target=mail, args=info)
        obj.start()
        jo.append(obj)
​
    # 将所有的子进程全部放入jo列表,在循环join所有子进程,就能等待所有子进程结束后在做操作
    for o in jo:
        o.join()
​
    # 所有的子进程结束的操作
    print('全部发送完毕')
    
# 输出
给20岁的鲍勃发了一封邮件!延迟0.19840279388911186秒
给18岁的小杨发了一封邮件!延迟0.8891892863366903秒
给55岁的艾伦发了一封邮件!延迟0.0434307277609951秒
全部发送完毕

5、多进程之间的数据是否隔离

from multiprocessing import Process
​
count = 1
​
def func():
    global count
    count += 1
​
if __name__ == '__main__':
    for i in range(10):
        obj = Process(target=func)
        obj.start()
    print(count)        # ————>1 主进程的count没有被改变说明进程之间的数据时隔离的
    
# 输出
1

6、为什么在Windows中Process()必须放到if __name__ == '__main__':下

由于Windows没有fork,多处理模块启动一个新的Python进程并导入调用模块。

如果在导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资源)。

这是隐藏对Process()内部调用的原,使用if __name__ == '__main__':,这个if语句中的语句将不会在导入时被调用。

以上就是python process模块的使用简介的详细内容,更多关于python process模块的使用的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
Python中多线程thread与threading的实现方法
Aug 18 Python
python对字典进行排序实例
Sep 25 Python
Python入门篇之函数
Oct 20 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python写的一个定时重跑获取数据库数据
Dec 28 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
基于Python fminunc 的替代方法
Feb 29 Python
python+gdal+遥感图像拼接(mosaic)的实例
Mar 10 Python
Python 实现简单的客户端认证
Jul 29 Python
学习Python需要哪些工具
Sep 04 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 Python
django学习之ajax post传参的2种格式实例
May 14 #Python
Python djanjo之csrf防跨站攻击实验过程
python控制台打印log输出重复的解决方法
聊一聊python常用的编程模块
May 14 #Python
如何获取numpy array前N个最大值
May 14 #Python
使用pandas模块实现数据的标准化操作
pandas 实现将NaN转换为None
May 14 #Python
You might like
php 获取可变函数参数的函数
2009/08/26 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP小教程之实现链表
2014/06/09 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
JavaScript 事件对象的实现
2009/07/13 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
从零学Python之hello world
2014/05/21 Python
wxPython事件驱动实例详解
2014/09/28 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
迟到检讨书900字
2014/01/14 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL