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 相关文章推荐
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
Sanic框架请求与响应实例分析
Jul 16 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
Python tcp传输代码实例解析
Mar 18 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
PyQt QMainWindow的使用示例
Mar 24 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
安装dbus-python的简要教程
2015/05/05 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
公司授权委托书
2014/10/17 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
2015国庆节宣传语
2015/07/14 职场文书
我爱我班主题班会
2015/08/13 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
股东协议书范本2016
2016/03/21 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python