前言
初学并发的时候一想到并发,然后就和多线程对等了。这就有一丢丢狭隘了,比如说node是单线程,但是人家可以高并发。说明并发并不是一个简单的多线程问题。
同样很多人说硬件cpu的发展为并发提供基础,在这里也可以看出是其实是为多线程提供基础,为并发提供发展道路。
并发的优点在操作系统单核的时候就体现了,最好的体现就是操作系统中线程的调度。而我们能做哪种并发,取决于操作系统能做哪种并发,没有人会以为自己写的程序真的能创建线程。
下面是个人的一些使用过得并发路子,由于接触有限只是用下面4种。
正文
1.多线程
采用多个线程来执行程序。在此指狭隘的多线程概念,比如说一个程序,执行不同类型的任务采用不同的线程,这些线程一直伴随着程序的生命周期。
2.并行处理
是多线程中的一种。把正在执行的大量任务分割成小块,分配给多个同时运行的程序。
下面是百度百科的概念:
并行处理(Parallel Processing)是计算机系统中能同时执行两个或多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。
为使用并行处理,首先需要对程序进行并行化处理,也就是说将工作各部分分配到不同处理进程(线程)中。并行处理由于存在相互关联的问题,因此不能自动实现。另外,并行也不能保证加速。从理论上讲,在 n 个并行处理的执行速度可能会是在单一处理机上执行的速度的 n 倍。
狭隘的多线程解决不同类型的任何互不干预。而并行处理则是从任务的角度分割,切换成小而完整的任务,利用多线程去实行并行处理。
之所以会有这种模式,是因为我们会有大的任务,这会影响其他任务的执行,不可能把苹果都放在一个篮子里面。
3.异步编程
它采用future模式或者回调模式机制,以避免产生不必要的线程。
为什么会产生这种概念呢?是因为比如A线程,要等待B线程的结果才能继续运行,这就有很大的问题了。
一个线程运行到一半去请求B的数据,尴尬不?这不符合多线程的理想情况,理想情况是不干预啊。
以人的思维来说,一件事情A做到一半,要等待另外一件事情B完成。万一B干到一半出事了呢?那么A是不是尴尬了?
这样一想是不是一个尴尬的问题?对电脑来说,就更是了。
举一个例子:
我们知道js调用浏览器的api来实现对后台的访问的,我们打开一个网页一下子会请求很多数据,但是呢,即使网页加载到一半的时候我们可以操作网页,比如我们的点击操作,这一部分会调用js代码。
而且我们知道js是单线的,也就是说js掉完浏览器的api之后,并没有阻塞我们的js这条单线。但是当服务器返回的时候我们的页面又有数据了。这是因为浏览器当结果返回的时候,会调用我们的js方法。
这个js方法就是未来任务,也就是feature。
当然每个人的理解是不同的,如果有误望请指出。
响应式编程
百度百科上:
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
说的非常笼统,这意味着什么呢?意味着这东西还没有具体化,概念还未具体化,没有实现其普遍性的价值。涉及到数据流的问题,在此就不好解释,后续慢慢展开。
总结
那么一个程序是如何运用这四种模式呢?
1.多线程:
2.并行处理
3.异步编程
4.响应式编程
数据驱动。