并发(concurrency)和它的表现形式之一并行处理(parallel processing)是就计算机领域开发过程中经常讨论的话题之一。今天,博主就谈谈自己对这两个名词的理解吧!
并发概念:
在1976年Leslie Lamportfa发表的论文中指出了。如果说两个事件互相不影响,则两个事件是并发的。通过推断程序,算法或者问题中事件,我们可以说,如果他们可以完全或者部分分解为顺序无关的组件单位,则事件是并发的。可以彼此独立的处理这些单元,并且处理的顺序不会最终影响最终的结果。
在计算机领域发开过程中,并发具体指的就是应用能够交替执行不同的任务,并发有点类似于多线程的原理,多线程并非是同时执行多个任务。如果你开多个线程执行,,其实是计算机的操作系统通过时间片轮转法等算法调度执行任务,是在以我们无法感觉到的速度,在切换不同的任务程序。让我们误以为是"同时执行效果",但其实并不是这样的。
并行的概念
指应用能够同时执行不同的任务,例:吃饭的时候可以边吃饭边打电话,这两件事情可以同时执行
并行和并发的区别点就在于,一个是交替执行,一个是同时执行。
在我们Python开发过程中,处理高并发和并行有三个常见又重要的解决模型方法
- 多线程 (multithreading)
- 多进程 (multiprocessing)
- 异步编程(asynchronous programming)
在开发过程中,经常会遇到大规模访问量的访问,当你需要同时满足多个用户或者软件代理请求时,会遇到下面的问题,:
- 处理作业的时间受单个处理单元(单机,CPU内核等)性能的限制
- 在处理完成上一个输入的处理之前,不能接受和处理新的输入
这个时候,对于类似的问题,并发处理就是最佳的选择:
- 扩展 ,这个问题很重要,并且在可接受的时间或可用的资源范围内,处理它们的唯一方法就是将执行分配到可并行处理工作的的多个处理单元上。
- 保持响应(接受新输入),即使应用程序并没有处理完旧的输入。
上面的问题覆盖了并发处理问题的绝大数情况。对于第一个问题是肯定需要并行处理的解决方案,这个时候会采用多线程和多进程的方法来解决。然而第二问题,并不一定需要并行处理。真实的解决方案实际取决于问题的细节。另外它也同时涵盖 了另外一种情况,就是应用程序需要独立的为多个客户端提供服务,而无需等待其他客户端被成功处理。
另外指出的是,上面两个问题并不是互斥的。通常,为了维护应用程序的响应性,我们无法在单个单元上处理输入。这就是为什么不同刚发的并且看似可替代或冲突的并发方法可能经常同时使用的原因。这种问题,在web端开发过程中常见,这个时候我们可以使用异步事件循环或结合多个进程的线程,以便利用可用资源,并且在高负载下维持延迟。