进程
什么是进程
进程就是一个正在运行的程序或者软件, 是操作系统进行资源分配的基本单位. 也就是说我们每启动一个进程, 操作系统都会给其分配一定的运行资源(内存资源), 来保证进程的运行
注意点:一个程序运行后至少有一个进程, 一个进程默认有一个线程, 进程里边可以创建多个线程, 线程是依附在进程里边的, 没有进程就没有线程
多进程的使用
Process(group,target,name,args,kwargs)
group: 指定进程组名 默认为空; 一般情况用不到,默认就好
target: 指定子进程运行的函数名
args:元祖传参
kwargs: 字典传参
name: 进程名字
Process创建的实例对象的常用方法:
start() : 启动子进程实例(创建子进程)
join() : 等待子进程执行结束
terminate() : 不管任务是否完成, 立即终止子进程
import time
import multiprocessing
def sing(singer,sname):
for i in range(5000):
print("%s 正在唱%s" % (singer, sname))
time.sleep(1)
def dance(dancer, dname):
for i in range(5000):
print("%s正在跳%s" % (dancer, dname))
if __name__ = "__main__":
# 创建子进程, 在子进程中运行 sing 函数
# 创建一个对象, target 指定子进程运行的函数名, 调用对象的 .start() 启动子进程的运行
sing_pro = multiprocessing.Process(target=sing, arg=("凤凰传奇", "月亮之上"), name="sing")
# 启动 sing 的子进程
sing_pro.statrt()
time.sleep(3)
# 终止 sing 的子进程
sing_pro.terminate()
# 创建一个子进程, 在子进程中运行 dance 函数
# 创建一个对象, tardet 指定子进程的函数名, 调用对象的 .start() 启动子进程的运行
dance_pro = multiprocess.Process(target=dance, kwarg={"dancer": "迈克", "dname": "太空漫步"}, name=dance)
# 启动 dance 的子进程
dance_pro.start()
time.sleep(3)
# 终止 dance 的子进程
dance_pro.terminate
# 等待两个子进程执行完成, 在执行后边的代码
sing_pro.join()
dance_pro.join()
#
print("哇,他们他厉害了~~~")
# 控制台输出
凤凰传奇正在唱月亮之上
凤凰传奇正在唱月亮之上
凤凰传奇正在唱月亮之上
迈克正在跳太空漫步
迈克正在跳太空漫步
迈克正在跳太空漫步
太棒了 哇........
验证多进程执行顺序
import multiprocessing
import time
def func(no):
for i in range(6):
time.sleep(1)
print(no)
if __name__ == "__main__"
for i in range(5):
pro = multiprocessing.Process(target=func, args=(i,))
pro.start()
# 多进程执行是无序和操作系统调度策略有关
验证多进程是否共享全局变量
import multiprocessing
g_number = 0
def func():
global g_number
g_number += 1000
print("子进程修改完毕 %s" % g_number)
if __name__ == "__main__":
# 1. 创建一个子进程 让他修改全局变量
p = multiprocessing.Process(target=func)
p.start()
# 2. 主进程等待子进程退出 再去查看全局变量的结果
p.join()
print("全局变量的值是 %d" % g_number)
# 结论: 主进程和子进程之间 不共享全局变量
# 独立的数据空间 创建子进程时父进程给子进程拷贝一份数据
# 控制台输出
子进程修改完毕 1000
全局变量的值是 0
daemon进程
1.我们可以将子进程设置为守护进程, 这样就可以让主进程在退出的时候顺便带领所有的 daemon 子进程一起退出
2.默认情况下主进程会等所有的额子进程执行完成之后在销毁, 设置守护进程的目的是主进程退出所有的daemon子进程销毁, 不让主进程在等待子进程
3.设置守护进程的方式: 子进程对象.daemon = True
import multiprocessing
import os
import time
def f():
while True:
print("子进程 %s" % os.getpid())
time.sleep(0.5)
def func():
for i in range(30):
time.sleep(1)
if __name__ = "__main__":
# 创建一个子进程 让子进程运行3秒就退出 主进程等待子进程完成
pro = multiprocessing.Process(target=func)
# 将这个子进程设置为 daemon 子进程
pro.daemon = True
pro.start()
# pro.join()
pro1 = multiprocess.Process(target=f)
pro1.daemon = True
pro1.start()
# pro1.join()
print("阿拉啦啦啦啦啦")
# 主进程没有代码执行了 默认等待子进程一起退出
# 如果主进程没有代码了 想要让所有的子进程跟随主进程一起退出
# 可以将子进程设置为 daemon 进程, 一旦主进程退出的子进程就退出了
# 控制台输出(可以注释掉 daemon 试试不同结果)
阿拉啦啦啦啦啦
获取进行编号
意义: 一个 os 中运行很多的进程, 为了便于管理这些进程(分配的资源),给每个进程分配了一个唯一的进程编号P容cess IDenttify
查看当前进程 PID os.getpid()
获取当前进程的父进程的 PID os.getppid()
默认情况下 子进程的父进程就是当前程序中的主进程