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动态监控日志内容的示例
Feb 16 Python
python使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
Windows下PyMongo下载及安装教程
Apr 27 Python
Python3安装Pymongo详细步骤
May 26 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python处理中文标点符号大集合
May 14 Python
python 剪切移动文件的实现代码
Aug 02 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
python多线程扫描端口(线程池)
Sep 04 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
PHP文件与目录操作示例
2016/12/24 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
FireFox JavaScript全局Event对象
2009/06/14 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
Vue非父子组件通信详解
2017/06/12 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
python清除指定目录内所有文件中script的方法
2015/06/30 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Django视图、传参和forms验证操作
2020/07/15 Python
详解Python中第三方库Faker
2020/09/25 Python
小学生读书感言
2014/02/12 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
会计工作岗位职责
2015/02/03 职场文书
会议室管理制度范本
2015/08/06 职场文书
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS