Python进程状态与multiprocessing模块使用详解
本文详细解析Python中进程的概念与三种运行状态,重点介绍如何使用multiprocessing模块的Process类创建子进程。内容涵盖进程PID获取、构造函数参数说明、常用方法如start和join,以及子进程间全局变量不共享的特性,附带完整代码示例。
本文通过具体实例深入解析Python中进程的状态机制、创建方式及实际使用方法,旨在为读者提供清晰的参考指南。
进程概念与运行状态
进程及其运行状态
1. 进程概念解析
程序是指静态的代码文件,例如xxx.py,它本身不执行任何操作。
进程则是程序运行时的实体,由代码和所占用的系统资源共同组成,它是操作系统进行资源分配的基本单元。
除了线程可以实现多任务处理外,进程同样具备执行多任务的能力。
2. 进程的三种状态
在实际工作中,待处理的任务数量通常超过CPU的核心数量。这意味着部分任务正在执行,而其余任务处于等待状态,从而形成了不同的进程状态。
- 就绪态:进程已具备所有运行条件,正在等待CPU调度以执行。
- 执行态:CPU正在运行该进程的功能代码。
- 等待态:进程因等待某些条件满足(如执行sleep操作)而暂时挂起。
使用multiprocessing创建进程
进程的创建:使用multiprocessing模块
multiprocessing模块提供了跨平台的多进程支持,通过Process类来代表一个进程对象。该对象可视为一个独立的执行单元,用于执行特定的任务。
示例:两个while循环并发执行
# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
def run_proc():
"""子进程要执行的代码"""
while True:
print("----2----")
time.sleep(1)
if __name__=='__main__':
p = Process(target=run_proc)
p.start()
while True:
print("----1----")
time.sleep(1)
说明
- 创建子进程时,需传入执行函数及其参数,实例化Process对象后调用start()方法即可启动进程。
示例:获取进程PID
# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time
def run_proc():
"""子进程要执行的代码"""
print('子进程运行中,pid=%d...' % os.getpid()) # os.getpid获取当前进程的进程号
print('子进程将要结束...')
if __name__ == '__main__':
print('父进程pid: %d' % os.getpid()) # os.getpid获取当前进程的进程号
p = Process(target=run_proc)
p.start()
Process类的语法结构如下:
Process([group [, target [, name [, args [, kwargs]]]]])
- target:指定子进程要执行的函数引用。
- args:以元组形式向target指定的函数传递位置参数。
- kwargs:以字典形式向target指定的函数传递关键字参数。
- name:为进程设定别名,若不设定则使用默认值。
- group:指定进程组,大多数场景下无需使用。
Process实例的常用方法:
- start():启动子进程,即创建并运行子进程。
- is_alive():检查子进程是否仍在运行。
- join([timeout]):主进程等待子进程执行完毕,或等待指定的秒数。
- terminate():无论任务是否完成,立即终止子进程。
Process实例的常用属性:
- name:进程别名,默认为Process-N,N为从1开始递增的整数。
- pid:当前进程的进程号(Process ID)。
子进程参数传递与变量隔离
示例:向子进程函数传递参数
# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
from time import sleep
def run_proc(name, age, **kwargs):
for i in range(10):
print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
print(kwargs)
sleep(0.2)
if __name__=='__main__':
p = Process(target=run_proc, args=('test',18), kwargs={"m":20})
p.start()
sleep(1) # 1秒中之后,立即结束子进程
p.terminate()
p.join()
运行结果如下:
子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20}
示例:进程间不共享全局变量
# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time
nums = [11, 22]
def work1():
"""子进程要执行的代码"""
print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
for i in range(3):
nums.append(i)
time.sleep(1)
print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
def work2():
"""子进程要执行的代码"""
print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))
if __name__ == '__main__':
p1 = Process(target=work1)
p1.start()
p1.join()
p2 = Process(target=work2)
p2.start()
运行结果如下:
in process1 pid=11349 ,nums=[11, 22] in process1 pid=11349 ,nums=[11, 22, 0] in process1 pid=11349 ,nums=[11, 22, 0, 1] in process1 pid=11349 ,nums=[11, 22, 0, 1, 2] in process2 pid=11350 ,nums=[11, 22]
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述内容能对读者的Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









