进程与线程(Process--Thread):
线程是真正工作的那个单元,而进程可以理解为线程的容器。
对于一个程序,至少有一个进程,而一个进程下至少有一个线程。可以这样类比,例如:
对于一个工厂,至少有一个车间,而一个车间下至少有一名工人。
为了提高产能,可以(1)创建多个车间,每个车间内1个工人各自使用其中车间的资源,也就是多进程;
也可以(2)在一个车间中招进多个工人,所有工人公用车间内的资源,也就是多线程。
对于python代码,一个py文件可以理解为一个工厂(程序),其中可以有多个进程,一个进程下又可以有多个线程。
多进程效率>多线程效率>单进程单线程串行效率
协程(Coroutine):协程不是计算机所天生提供的,而是由程序员创造出来的。
协程也可以被称为微线程,是一种用户态内的上下文切换技术。
简而言之,其实就是通过一个线程实现代码块之间相互切换执行。
以python为例,有这样一段代码:
def func1():
print(1)
print(2)
def func2():
print(3)
print(4)
func1()
func2()
协程就是在func1()和func2()中的几个print间交替执行而不是以打印1234这样的正常顺序。
那么如何实现协程呢?有这样几种办法:
(1)基于greenlet模块(早期的一种模块)
(2)yield关键字(通过寄存的思想)
(3)通过asyncio模块的装饰器(python3.4后引入的)
(4)async、await关键字(python3.5后引入的)【主流办法】
并发(Concurrency):计算机同时执行多项任务。例如:
对于单核心处理器:计算机可以通过分配时间片的方式,
让多个任务中每个任务运行一段时间再切换下一个任务,这种方式被称为上下文切换(context switching)
实际上这种方式并不是真正的同时执行,而是由于时间片过短,在视觉上看上去是同时执行。
对于多核心处理器:可以让不同的任务 同时的在多个核心上进行,是真正的并行,即下文中的Parallelism
并行(Parallelism):
让多个任务真正的同时进行。
同步(Synchronous):并不是字面上的同步,更好的可以理解为“同道”。
也就是让不同的任务在同一条道路上执行,但是要分先后,上一个任务执行完才执行下一任务。
异步(Asynchronous):更好的可以理解为“异道”。
即两个任务在不同的道路上,同时执行。
多线程就是实现异步的一种方式。(异步是一种思想,多线程是其实现方式。)
当是多核心处理器时,每个线程就会被分配到不同的核心上执行,实现真正的并行。
当是单核心处理器时,则会通过分配时间片的形式,并发执行任务。也可以将并发理解为一种异步,但并发绝对不是同步。