目录
一、进程的简述
1. 进程的介绍
在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。
2. 进程的概念
一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
进程与线程的关系:
一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。
二、进程的使用
1 创建进程
# 导入进程包
import multiprocessing
# 创建子进程
process = multiprocessing.Process(group, target, args, kwargs, name)
2. Process进程类的说明
Process([group [, target [, name [, args [, kwargs]]]]])
- group:指定进程组,目前只能使用None
- target:执行的目标任务名
- name:进程名字
- args:以元组方式给执行任务传参
- kwargs:以字典方式给执行任务传参
Process创建的实例对象的常用方法:
- start():启动子进程实例(创建子进程)
- join():等待子进程执行结束
- terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
3.代码示例:
import multiprocessing
import time
def dance():
for i in range(3):
print('dancing')
time.sleep(1)
def sing():
for i in range(3):
print('singing')
time.sleep(1)
if __name__ == '__main__':
# 创建子进程
dance_process = multiprocessing.Process(target=dance)
sing_process = multiprocessing.Process(target=sing)
# 启动进程
dance_process.start()
sing_process.start()
结果显示:
dancing
singing
dancing
singing
dancing
singing
三、获取进程编号
1. 获取进程编号的目的
获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。
获取进程编号的两种操作
- 获取当前进程编号
- 获取当前父进程编号
2. 获取当前进程编号
os.getpid() 表示获取当前进程编号
3.代码示例:
import multiprocessing
import time
import os
def dance():
# 获取当前进程的编号
print("dance:", os.getpid())
# 获取当前进程
print("dance:", multiprocessing.current_process())
for i in range(5):
print("跳舞中...")
time.sleep(0.2)
# 扩展:根据进程编号杀死指定进程
# os.kill(os.getpid(), 9)
def sing():
# 获取当前进程的编号
print("sing:", os.getpid())
# 获取当前进程
print("sing:", multiprocessing.current_process())
for i in range(5):
print("唱歌中...")
time.sleep(0.2)
if __name__ == '__main__':
# 获取当前进程的编号
print("main:", os.getpid())
# 获取当前进程
print("main:", multiprocessing.current_process())
dance_process = multiprocessing.Process(target=dance)
sing_process = multiprocessing.Process(target=sing)
dance_process.start()
sing_process.start()
结果:
main: 4243
main: <_MainProcess name='MainProcess' parent=None started>
sing: 4245
sing: <Process name='Process-2' parent=4243 started>
唱歌中...
dance: 4244
dance: <Process name='Process-1' parent=4243 started>
跳舞中...
唱歌中...
跳舞中...
跳舞中...
唱歌中...
跳舞中...唱歌中...唱歌中...跳舞中...
四、进程执行带有参数的任务
1. 进程执行带有参数的任务的介绍
Process类执行任务并给任务传参数有两种方式:
- args 表示以元组的方式给执行任务传参
- kwargs 表示以字典方式给执行任务传参
2. args参数的使用
import multiprocessing
import time
# 带有参数的任务
def task(count):
for i in range(count):
print("任务执行中..")
time.sleep(2)
else:
print("任务执行完成")
if __name__ == '__main__':
# 创建子进程
# args: 以元组的方式给任务传入参数
sub_process = multiprocessing.Process(target=task, args=(5,))
sub_process.start()
3.kwargs参数的使用
import multiprocessing
import time
# 带有参数的任务
def task(count):
for i in range(count):
print("任务执行中..")
time.sleep(2)
else:
print("任务执行完成")
if __name__ == '__main__':
# 创建子进程
# kwargs: 表示以字典方式传入参数
sub_process = multiprocessing.Process(target=task, kwargs={"count": 3})
sub_process.start()
五、进程的注意事项
- 进程之间不共享全局变量
- 主进程会等待所有的子进程执行结束再结束