线程与异步
我最近在看一篇很不错的文章,里面讲了线程模型和异步模型的编程方式。你可以在这里找到这篇文章:http://krondo.com/blog/?p=1209
不过,文章提到了一些要点:
- 异步程序在处理输入输出(I/O)时,会在任务之间切换,这样效率会比同步程序高。
- 线程是由操作系统来管理的。
我记得我读过,线程是通过在准备队列和等待队列(还有其他队列)之间移动线程控制块(TCB)来由操作系统管理的。在这种情况下,线程也不会浪费时间在等待上,对吧?
基于以上提到的内容,异步程序相比线程程序有什么优势呢?
7 个回答
假设你有两个任务,这两个任务不涉及任何输入输出操作(在多处理器机器上)。在这种情况下,线程的表现会比异步更好。因为异步就像一个单线程程序,会按照顺序执行你的任务。而线程可以同时执行这两个任务。
假设你有两个任务,这两个任务涉及输入输出操作(在多处理器机器上)。在这种情况下,异步和线程的表现差不多(性能可能会根据核心数量、调度方式、任务的处理强度等有所不同)。而且,异步占用的资源更少,开销低,编程也比多线程程序简单。
它是怎么工作的呢? 线程1执行任务1,由于它在等待输入输出,所以被移到输入输出等待队列。同样,线程2执行任务2,因为它也涉及输入输出,所以也被移到输入输出等待队列。一旦它的输入输出请求解决,就会被移到准备队列,这样调度器就可以安排这个线程执行。
异步执行任务1,并且在等待它的输入输出完成之前,继续执行任务2,然后再等待两个任务的输入输出完成。它按照输入输出完成的顺序来完成任务。
异步最适合涉及网络服务调用、数据库查询调用等任务,而线程则适合处理强度大的任务。
下面的视频解释了异步与线程模型
的区别,以及何时使用等,
https://www.youtube.com/watch?v=kdzL3r-yJZY
希望这对你有帮助。
创建线程有两种方式:
同步线程 - 父线程创建一个(或多个)子线程,然后必须等每个子线程结束后才能继续。同步线程通常被称为 分叉-合并模型。
异步线程 - 父线程和子线程可以同时运行,互不影响。多线程服务器通常采用这种模型。
资源 - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720
- 写出线程安全的代码非常困难。使用异步代码时,你可以清楚地知道代码是如何从一个任务切换到另一个任务的,因此出现竞争条件的可能性就小得多。
- 线程会消耗相当多的资源,因为每个线程都需要有自己的栈。而使用异步代码时,所有代码共享同一个栈,而且由于任务之间不断地展开栈,栈的大小保持得很小。
- 线程是操作系统的一部分,因此需要更多的内存来支持它们。而异步任务就没有这个问题。
更新 2022:
现在很多编程语言都支持无栈协程(async/await)。这让我们几乎可以同步地编写任务,同时在特定的地方(比如等待或网络请求)让出控制权给其他任务(也就是await
)。