1、进程
#进程(Process,有时被称为重量级进程)是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈以及记录运行轨迹的辅助数据,操作系统管理运行的所有进程,并为这些进程公平分配时间。进程可以通过fork和spawn操作完成其他任务。因为各个进程有自己的内存空间、数据栈等,所以只能使用进程间通信(IPC),而不能直接共享信息。
2、线程
#线程(Thread,有时被称为轻量级进程)跟进程有些相似,不同的是所有线程运行在同一个进程中,共享运行环境。
#线程有开始、顺序执行和结束3部分,有一个自己的指令指针,记录运行到什么地方。线程的运行可能被抢占(中断)或暂时被挂起(睡眠),从而让其他线程运行,这叫作让步。一个线程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程之间更方便地共享数据和相互通信。
#线程一般是并发执行的。正是由于这种并行和数据共享的机制,使得多个任务的合作变得可能。实际上,在单CPU系统中,真正的并发并不可能,每个线程会被安排成每次只运行一小会儿,然后就把CPU让出来,让其他线程运行。
#在进程的整个运行过程中,每个线程都只会做自己的事,需要时再跟其他线程共享运行结果,。多个线程共同访问同一片数据不是完全没有危险的,由于数据访问的顺序不一样,因此有可能导致数据结果不一致的问题,这叫作竞态条件。大多数线程库都带有一系列同步原语,用于控制线程的执行和数据的访问。
3、多线程与多进程
#对于“多任务”这个词,相信读者不会是第一次看见,现在的操作(如Mac OS X、UNIX、Linux、Windows等)都支持“多任务”操作系统。
#什么叫“多任务”呢?简单地说,就是系统可以同事运行多个任务。比如,一边用浏览器上网,一边用云音乐,一边聊天,这就是多任务。此时手头已经有3个任务在运行了。如果查看任务管理器,可以看到还有很多任务悄悄在后台运行着,只是桌面没有显示出来而已。
#对于操作系统来说,一个任务就是一个进程,开启多个任务就是多进程。
#有些进程不止可以同时做一件事情,比如work可以同时打字、拼写检查、打印等。在一个进程内部,要同时做多件事,就需要同时运行多个线程。
#多线程类似于同时执行多个不同的程序,多线程运行有以下3个优点:
①、使用线程可以把占据长时间的程序中的任务放到后台去处理。
②、用户界面可以更加吸引人,比如用户单击一个按钮,用于触发某些事件的处理,可以弹出一个进度条显示处理的进度。
③、程序的运行速度可能加快。
#在实现一些等待任务(如用户输入、文件读写和网络收发数据等)时,使用多线程更加有用。在这种情况下,我们可以释放一些珍贵资源(如内存占用等)。
#线程在执行过程中与进程还是有区别的,每个独立线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不是独立执行,必须依存在进程中,由进程提供多个线程执行控制。
#由于每个进程至少要干一件事情,因此一个进程至少有一个线程,当然如word这种复杂的进程可以有多个进程,多个线程可以同时执行。多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂交替运行,看起来就像同时执行一样。当然,真正同时执行多线程需要多核CPU才能实现。
#我们前面编写的所有Python程序都是执行单任务的进程,也就是只有一个线程。如果我们要同时执行多个任务,该如何操作?
#有两种解决方法:一种方法是启动多个进程。每个进程虽然只有一个线程,但多个进程可以一起执行多个任务。另一种方法是启动一个进程,在一个进程内启动多个线程,这样多个线程也可以一起执行多个任务。
#当然,还有第3种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,不过这种模型过于复杂,实际很少采用。
#同时执行多个任务时,各个任务之间并不是没有关联的,而是需要相互通信和协调,有时任务1必须暂停任务等待任务2完成后才能继续执行有时任务3和任务4不能同时执行。多进程和多线程程序的复杂度远远高于我们前面写的单进程、单线程的程序。
#不过很多时候,没有多任务还真不行。想想在电脑上看电影,必须由一个线程播放视频,另一个线程播放音频,否则使用单线程实现只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这样显然不行。
#总而言之,多线程是多个相互关联的线程的组合,多线程是多个互相独立的进程的组合。线程是最小的执行单元,进程至少由一个线程组成。