写爬虫需要用到分布式爬虫,但是感觉有一些基本的概念还是没有搞清楚,所以还是停下来先研究研究多任务吧。
先给出一些来自维基百科的定义,然后再说说我自己的理解,可能会不准确,欢迎指正。
-
进程
进程(英语:process),是计算机中已运行程序的实体。进程为曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上) -
线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIXThread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。一个进程可以有很多线程,每条线程并行执行不同的任务。在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。 -
协程
与子例程一样,协程也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程源自Simula和Modula-2语言,但也有其他语言支持。协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道。
再写写我的理解:
-
多进程:
进程是一个操作系统级别的概念。简单点来说,同时运行多个程序就是多进程,是的一个程序就是一个进程。多核CPU自然不用说,每个核运行一个程序就好。理论上一个CPU只能给一个进程,如果想一个 CPU 运行多个进程的话,那就是多进程。比如当我们使用一个单核电脑同时听歌,写博客,运行代码,CPU 就会执行几毫秒这个程序,暂停,执行几毫秒另外一个程序,因为切换的很快,我们就感觉程序是在同时运行的一样。 -
多线程
线程是一个程序级别的概念,可以暂时理解为一个程序中的某个函数,当我们同时执行很多个函数的时候就是多线程。比如说一个程序有需要从网上下载东西的函数,还有要从磁盘中加载数据的函数,这两个函数都是比较耗时的。如果是单进程的话需要一个一个函数运行,下载完数据然后才能从磁盘加载,这样程序就会很卡顿。如果使用多进程的话,我们可以在下载数据的同时加载数据,这样就快的多了。 -
协程
这个概念是一个emmm代码级别的概念,我实在找不出来更好的词语了。协程与多进程很像,都是同时运行多个函数。但是进程是由操作系统来调度的,协程是由代码控制的。代码控制了一个函数什么时候该暂停执行,让出资源让另外一个函数执行。与线程相比,这种主动让出型的调度方式更为高效。一方面,它让调用者自己来决定什么时候让出,比操作系统的抢占式调度所需要的时间代价要小很多。后者为了能恢复现场会在切换线程时保存相当多的状态,并且会非常频繁地进行切换。
这里有一个关于协程的文章
上面在说多进程的时候提到了单核cpu 与多核 cpu 的问题,实际上不管是哪种,只要程序是同时运行的就是多进程,但是为了区别这两种情况,又有两个概念:
- 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
- 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
网友评论