Python multiprocessing.Process 模块详解:创建、参数与属性管理
本文详细介绍Python中multiprocessing模块的Process类,涵盖进程创建语法、核心参数(target、args、kwargs)及常用方法(start、terminate、join)。重点解析daemon守护进程机制、pid获取时机及exitcode状态,结合代码示例说明如何安全高效地管理多进程资源。
进程基本概念与资源管理
进程(Process)是操作系统进行资源分配和调度的基本单位,它封装了对各类系统资源的调用、内存空间的管理以及网络接口的访问权限。一个父进程可以衍生出多个子进程;当启动一个新进程时,系统会自动为其创建一个初始线程,该线程即为主线程,在Python中表现为 __name__ == '__main__' 的执行上下文。
进程Process模块
Process模块导入与创建语法
若需进行线程操作,Python提供了threading模块;同理,对于进程创建与管理,Python提供了专门的Process模块。在使用前需导入该模块,其基础创建语法如下:
# 导入进程模块
from multiprocessing import Process
# 创建进程
p = Process(group=None, target=None, name=None, args=(), kwargs={})
Process构造函数参数详解
参数介绍:
group — 目前未使用,默认值为None;
target — 指定调用对象,即子进程需要执行的具体任务(函数名);
args — 传递给目标函数的位置参数,类型必须为元组(tuple);
kwargs — 传递给目标函数的关键字参数,类型必须为字典(dict),例如 kwargs = {'name': 'Jack', 'age': 18};
name — 指定子进程的名称;
返回值:返回一个进程实例对象;
Process核心方法与属性解析
三.进程Process函数介绍
Process类的函数接口与threading模块类似,具体功能如下:
1.start() — 启动子进程,使子进程开始执行target指定的任务;
2.terminate() — 强制终止进程,不执行任何清理操作。若该进程在终止前创建了子进程,这些子进程在父进程强制结束后将变为僵尸进程;若进程持有锁资源,强制终止可能导致锁无法释放,进而引发死锁,使用时需谨慎;
3.is_alive() — 检查进程是否存活,存活返回True,否则返回False;
4.join([timeout]) — 主线程阻塞等待子线程终止。timeout为可选的超时时间。需注意,p.join()仅能等待通过start()启动的进程,无法等待直接调用run()的进程;
5.daemon — 默认值为False。若设置为True,表示该进程为后台守护进程;当父进程结束时,该子进程也会随之终止。设置为True后,该进程不能再创建子进程,且必须在调用start()之前设置;
6.name — 获取或设置进程名称;
7.pid — 进程ID标识。注意:若在start()函数之前获取pid,其值为None,因为此时进程尚未创建;
8.exitcode — 进程运行期间为None;若值为-N,表示进程被信号N终止;
9.authkey — 进程身份验证密钥,默认由os.urandom()随机生成32字符字符串。该密钥用于确保底层进程间通信(如网络连接)的安全性,只有具有相同身份验证密钥的连接才能成功;
代码示例与系统调用补充
进程Process使用
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com
@File:python_process.py
@Time:2019/12/21 21:25
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
from multiprocessing import Process
def people_info(*args,**kwargs):
print(args,kwargs)
def main():
# 信息列表
list_info = [{"name":"zhangsan","height":"175cm"},
{"name": "lisi", "height": "155cm"},
{"name": "wangwu", "height": "195cm"},
{"name": "liqi", "height": "166cm"},
{"name": "wangba", "height": "125cm"},]
# 创建进程
for i in range(5):
p = Process(target=people_info,args=(i,),kwargs=list_info[i])
# 设置为守护进程,必须设置在start函数之前,否则会产生异常
# 默认为False,即主进程会等待子进程结束之后才结束,
# 如果设置为True,主进程结束之后所有的子进程自动结束,不管子进程是否已经执行完所有任务
# p.daemon = True
# 启动进程
p.start()
# 获取进程pid,如果在start函数之前获取pid,默认为None,因为进程还没启动
print("进程process pid = ",p.pid)
# 获取进程名字
print("进程process name = ",p.name)
# 获取进程pid
print("进程process exitcode = ",p.exitcode)
if __name__ == "__main__":
main()
输出结果:
进程process pid = 2600
进程process name = Process-1
进程process exitcode = None
进程process pid = 4372
进程process name = Process-2
进程process exitcode = None
进程process pid = 14124
进程process name = Process-3
进程process exitcode = None
进程process pid = 10920
进程process name = Process-4
进程process exitcode = None
进程process pid = 4892
进程process name = Process-5
进程process exitcode = None
(0,) {'name': 'zhangsan', 'height': '175cm'}
(1,) {'name': 'lisi', 'height': '155cm'}
(2,) {'name': 'wangwu', 'height': '195cm'}
(3,) {'name': 'liqi', 'height': '166cm'}
(4,) {'name': 'wangba', 'height': '125cm'}
小窍门:
Python的os模块封装了常见的系统调用,其中包括:
os.fork() 创建子进程 os.getpid() 获取自身ID os.getppid() 获取父进程ID
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









