进程、线程和协程,三者有何本质区别?
摘要:一、进程 1、多任务原理 多任务是指操作系统同时可以运行多个任务。 单核CPU实现多任务原理:操作系统轮流让各个任务交替执行; 多核CPU实现多任务原理:真正的执行多任务只能在多核CPU上实现,多出来的任务轮流调度到每个核心上执行。 并发:
一、进程
1、多任务原理
多任务是指操作系统同时可以运行多个任务。
单核CPU实现多任务原理:操作系统轮流让各个任务交替执行;
多核CPU实现多任务原理:真正的执行多任务只能在多核CPU上实现,多出来的任务轮流调度到每个核心上执行。
并发:看上去一起执行,任务数多于CPU核心数;
并行:真正的一起执行,任务数小于等于CPU核心数。
实现多任务的方式:
1、多进程模式
2、多线程模式
3、协程模式
4、多进程+多线程模式
2、进程
对于操作系统而言,一个任务就是一个进程;
进程是系统中程序执行和资源分配的基本单元,每个进程都有自己的数据段、代码段、堆栈段。
下面是一小段程序,一个单任务的例子。在其中,有两个输出语句分别在在两个不同的循环当中,单任务的执行方式,也就是最初学习时,当一个循环没有结束的时候,无法执行到下面的程序当中。如果想要让两个循环可以同时在执行,就是在实现多任务,当然不是说同时输出,而是两个循环都在执行着。
1 from time import sleep
2 # 只能执行到那一个循环,执行不了run,所以叫单任务
3 def run():
4 while True:
5 print("&&&&&&&&&&&&&&&")
6 sleep(1.2)
7
8 if __name__ == "__main__":
9 while True:
10 print("**********")
11 sleep(1)
12 run()
接下来启用多任务,通过进程来实现。
multiprocessing库:跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象(fork仅适用于Linux)。
下面的程序是在一个父进程中创建一个子进程,让父进程和子进程可以都在执行,创建方式程序中已经很简洁了。可以自己把这两段程序复制下来运行一下,看看输出的效果。
1 from multiprocessing import Process
2 from time import sleep
3 import os
4
5 def run(str):
6 # os.getpid()获取当前进程id号
7 # os.getppid()获取当前进程的父进程id号
8 while True:
9 print("&&&&&&&&&&&&&&&%s--%s--%s" % (str, os.getpid(), os.getppid()))
10 sleep(0.5)
11
12 if __name__ == "__main__":
13 print("主(父)进程启动 %s" % (os.getpid()))
14 # 创建子进程
15 # target说明进程执行的任务
16 p = Process(target=run, args=("nice",))
17 # 启动进程
18 p.start()
19
20 while True:
21 print("**********")
22 sleep(1)
我想第一个单任务的程序就不必说了吧,就是一个死循环,一直没有执行到下面的run函数。第二段程序是通过多进程实现的多任务,两个循环都能执行到,我把结果截图放下面,最好自己去试一下。
3、父子进程的先后顺序
上面的多进程的例子中输出了那么多,我们使用的时候究竟是先执行哪个后执行哪个呢?根据我们的一般思维来说,我们写的主函数其实就是父进程,在主函数中间,要调用的也就是子进程。
