python 多进程 daemon 进程 验证多进程是否共享全局变量 验证多进程执行顺序

进程

什么是进程

进程就是一个正在运行的程序或者软件, 是操作系统进行资源分配的基本单位. 也就是说我们每启动一个进程, 操作系统都会给其分配一定的运行资源(内存资源), 来保证进程的运行
注意点:一个程序运行后至少有一个进程, 一个进程默认有一个线程, 进程里边可以创建多个线程, 线程是依附在进程里边的, 没有进程就没有线程
多进程的使用
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()
默认情况下 子进程的父进程就是当前程序中的主进程

发布了56 篇原创文章 · 获赞 17 · 访问量 2153

猜你喜欢

转载自blog.csdn.net/LanlanDeming/article/details/103633819