进程、线程和协程,三者有何本质区别?

摘要:一、进程 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、父子进程的先后顺序   上面的多进程的例子中输出了那么多,我们使用的时候究竟是先执行哪个后执行哪个呢?根据我们的一般思维来说,我们写的主函数其实就是父进程,在主函数中间,要调用的也就是子进程。
阅读全文