多进程和多线程
操作系统
操作系统是我们普通人为了操控计算机而出现的一个中间件。是我们普通人的福音,如果没有操作系统,计算机将会让百分之九十的人感觉好高端,剩下百分之八的人用的云里雾里,最后百分之二的人独自陶醉。什么?你说我数据这么出来的?我自己幻想的,我有兰博基尼,我年薪五百万,全靠我睡觉做梦。
多任务
我们肯定都拥有自己的电脑或者用过电脑。如果你没有用过电脑,请先去玩侠盗猎车,暴力摩托,cs1.5,cs1.6这些经典游戏,回来在看我的这篇文章,答应我,好不好?
当我在网上冲浪的时候,我会首先打开QQ微信,打开音乐,顺便打开浏览器。浏览完一天的新闻之后,我会去打游戏,这个时候音乐是一直播放的,QQ微信也是一直在持续通信的。这个时候就是一个多任务的情况。
多进程
我们电脑上打开的一个个软件,就是一个进程,他们是互相独立,互不影响的。由于cpu的执行速度特别快,你会感觉他们在同时运行一样。这就跟我们百米冲刺一样,大家跑的基本都差不多快,你根本发现不了谁快谁慢,同时运行一样。
程序是一个指令的集合
进程就是正在运行的程序
我们打开QQ跟网易云音乐,这就是两个进程,包括全局变量,他们互不影响。
多进程的基本结构
from multiprocessing import Process #导入Process包
#创建主进程
if __name__ == "__main__": #windows必须写这一行来判断是否是当前文件,如果不是会报错。max不需要写
p1 = Process() #创建子进程
p1.start() #子进程启动
p1.join() #父进程等待子进程执行完毕之后在执行
print(p1.pid)
程序刚开始运行的时候,会创建一个主进程,也就是我们当前的.py文件。然后在windows里面必须的判断是不是在当前文件里面,然后才可以创建子进程,进行一些操作。
子进程依赖于主进程,如果主进程结束,程序将会退出。
__name__ == "__main__"
python的文件有两种执行方式,第一种是直接作为程序执行,第二种是导入到其他python程序中被当作模块执行
__name__
表示当前模块的名字,__name__ == "__main__",判断是不是当前文件,只有在当前文件下才会执行,在其他文件是不会执行的
在windows上,子进程是会自动Import启动他的这个文件,而在Import的时候是会执行这些语句的,如果不加这段代码,就会递归创建子进程。所以必须用if把他保护起来,只启动一次
Process
Process类来创建一个子进程
Process(target = ,name,args = (元组))
target
表示调用对象,即子进程要执行的任务
name:子进程的名称
args:表示调用对象的位置参数元组
进程名.pid:子进程在系统中的pid
Process方法
p.start():启动进程,并调用该子进程中的run()方法
p.run():进程启动时运行的方法,正是他去调用target指定的参数,我们自定义的类中一定要实现该方法
p.terminate():强制终止进程,不会进行任何清理操作
p.is_alive():用来判断进程是否存在
p.join():主进程等待子进程终止,里面的参数可选超时时间
Process常用属性
name: 当前进程实例别名, 默认为Process-N, N为从1开始递增的整数;
pid: 当前进程实例的PID值
全局变量在多个进程中不共享,进程 之间的数据是独立的,默认情况互不影响
#全局变量在多个进程中是互不影响的,进程之间的数据是独立的
from multiprocessing import Process
num = 10 #全局变量
def func1():
global num
num += 10
print("func1 = " + str(num))
def func2():
global num
num += 100
print("func2 = " + str(num))
if __name__ == "__main__":
p1 = Process(target=func1)
p2 = Process(target=func2)
p1.start()
p2.start()
p1.join()
p2.join()
创建新的进程还能够使⽤类的⽅式, 可以⾃定义⼀个类, 继承Process类, 每次实例化这个类的时候, 就等同于实例化⼀个进程对象
# 创建新的进程还能够使⽤类的⽅式, 可以⾃定义⼀个类, 继承Process类, 每次实例化这个类的时候, 就等同于实例化⼀个进程对象
from multiprocessing import Process
class MyPro(Process):
def run(self): #子进程start之后就会自动执行run