多进程编程

多任务编程分为:多进程,多线程。

多任务:多个任务同时执行,提高CPU的利用率。

进程:一个正在执行的程序或软件,它是内存条分配资源的基本单元。

并发:任务数 > CPU数

并行:任务数 ≤ CPU数

多进程的基本语法:

1.引入进程模块包

2.创建主进程和子进程

3.运行子进程

多进程代码示例:(仔细阅读代码,代码里面有明显的注释,特别强调一点:多个子进程执行没有先后顺序,他们是随机运行的,读者可以多试几次就可以发现这一特点了)

# 调用multiprocessing模块和time模块
import multiprocessing
import time
def sing():
for i in range(5):
print("唱歌中")
print("这是子进程sing_pro")
time.sleep(1)
def dance():
for i in range(5):
print("跳舞中")
print("这是子进程dance_pro")
time.sleep(1)
# 创建子进程
if __name__ == "__main__":
print("主进程开始")
dance_pro = multiprocessing.Process(target=dance)
sing_pro = multiprocessing.Process(target=sing)
# 开启子进程
dance_pro.start()
sing_pro.start()
# join方法是进程阻塞,等此进程执行完之后再执行下面的代码
dance_pro.join()
sing_pro.join()
print("主进程结束")

多进程传参:

args方法:

dance_pro = multiprocessing.Process(target=dance, args=(3,))

args方法:

dance_pro = multiprocessing.Process(target=dance, args=(3,),kwargs={"time":1})

获取进程编号:每一个子进程都是通过主进程创建出来的,先有主,再有子。

重点:主进程和子进程执行的先后顺序:如果没有设置阻塞的话,主进程会最先执行,主进程开始执行后,就会创建子进程,然后子进程开始执行,从此之后,子进程和主进程之间在没有任何关系,主进程不会等待子进程结束之后在结束,但是整个程序会等待子进程结束之后在结束,程序结束的标志是:Process finished with exit code 0。

1.获取子进程编号

print("sing子进程编号:", os.getpid())  # 在子进程的代码中
# os.getpid() 其实是获取当前进程的编号

2.获取父进程编号

print("获取父进程编号:", os.getppid()) # 在子进程的代码中

杀死进程:相当于windows任务管理器里面的结束进程

要根据进程编号去杀死进程

语法:os.kill(os.getpid(), 9) # 9是指令,一般都用9

多进程注意事项:

1.进程之间不共享全局变量,每个进程的数据相互独立。

2.当创建子线程之后,主线程和子线程之后再无关系,但是程序会等待所有线程结束之后再结束。

3.守护主线程:程序一旦结束,所有子线程也要跟着结束。(应用于程序突然中止时)

子进程.daemon = True  必须写在start方法之前(先定义守护主线程)

4. 子进程.terminate()  必须写在start方法之后 (先开始,然后再terminate)

拓展方法:

exit()方法是用来结束整个程序的,后面的代码不在执行。