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 相关文章推荐
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
Python实现快速多线程ping的方法
Jul 15 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
python决策树之CART分类回归树详解
Dec 20 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
python 实现目录复制的三种小结
Dec 04 Python
你需要学会的8个Python列表技巧
Jun 24 Python
Python操作Elasticsearch处理timeout超时
Jul 17 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
开发大型 PHP 项目的方法
2007/01/02 PHP
php读取javascript设置的cookies的代码
2010/04/12 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
python新手经常遇到的17个错误分析
2014/07/30 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
使用python画社交网络图实例代码
2019/07/10 Python
python实现简单颜色识别程序
2020/02/19 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
关于VPN
2012/06/10 面试题
个人求职简历中英文自我评价
2013/12/16 职场文书
企业为何需要商业计划书
2013/12/26 职场文书