线程与异步

64 asynchronous twisted

我从这篇非常好的文章中读到了编程的线程模型与异步模型.http://krondo.com/blog/?p=1209

但是,文章提到了以下几点.

  1. 只要有I/O,异步程序就会通过在任务之间切换来超越同步程序.
  2. 线程由操作系统管理.

我记得通过在Ready-Queue和Waiting-Queue(以及其他队列之间)之间移动TCB来读取线程由操作系统管理.在这种情况下,线程不会浪费时间等待它们吗?

鉴于上述情况,异步程序相对于线程程序有什么优势?

dor*_*ron 67

  1. 编写线程安全的代码非常困难.使用异步代码,您可以准确地知道代码从一个任务转移到另一个任务的位置,因此竞争条件更难实现.
  2. 线程消耗大量数据,因为每个线程都需要拥有自己的堆栈.使用异步代码,所有代码共享相同的堆栈,并且由于在任务之间不断地展开堆栈,堆栈保持很小.
  3. 线程是OS结构,因此是平台支持的更多内存.异步任务没有这样的问题.

  • 详细说明:1.线程代码的I/O部分相对容易,但是在没有竞争条件的情况下管理线程之间的共享状态(使用锁/队列/等)使得它变得棘手.使用异步模型意味着您可以同时减少进度,因此可以轻松避免比赛.2/3.每个线程将消耗至少一个堆栈的内存页(通常为4KB或8KB),以及与该线程状态相关的其他数据结构的一些未知内存量. (10认同)

Lak*_*thi 12

  1. 假设您有 2 个任务,它们不涉及任何 IO(在多处理器机器上)。在这种情况下,线程优于异步。因为 Async 就像单线程程序一样按顺序执行您的任务。但是线程可以同时执行这两个任务。

  2. 假设您有 2 个任务,涉及 IO(在多处理器机器上)。在这种情况下,异步和线程执行或多或少相同(性能可能因内核数量、调度、任务的进程密集程度等而异)。此外,异步占用更少的资源、低开销并且在多线程程序上编程更简单。

这个怎么运作?线程1执行任务1,由于正在等待IO,所以移到IO等待队列。同样线程2执行任务2,由于也涉及到IO,所以移到IO等待队列。一旦它的 IO 请求得到解决,它就会被移动到就绪队列,以便调度程序可以安排线程执行。

异步执行任务 1 并且不等待它的 IO 完成它继续执行任务 2 然后它等待两个任务的 IO 完成。它按照IO完成的顺序完成任务。

异步最适合涉及 Web 服务调用、数据库查询调用等的任务,线程用于处理密集型任务。

下面的视频解释了Async vs Threaded model以及何时使用等, https://www.youtube.com/watch?v=kdzL3r-yJZY

希望这是有帮助的。

  • 始终欢迎提供指向潜在解决方案的链接,但请[在链接周围添加上下文](//meta.stackoverflow.com/a/8259),以便您的其他用户了解它是什么以及它为什么存在。**始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。** 考虑到_仅仅只是指向外部站点的链接_可能是[为什么和一些答案是如何被删除的?](//stackoverflow.com/help/deleted-answers)。 (3认同)

Aid*_*len 10

有两种方法可以创建线程:

同步线程 - 父级创建一个(或多个)子线程,然后必须等待每个子级终止.同步线程通常称为fork-join模型.

异步线程 - 父和子并发/独立运行.多线程服务器通常遵循此模型.

资源 - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720


Joe*_*ney 6

首先,请注意线程是如何实现和调度的很多细节都是特定于操作系统的。通常,您不必担心线程相互等待,因为操作系统和硬件会尝试安排它们高效运行,无论是在单处理器系统上异步运行还是在多处理器系统上并行运行。

一旦线程完成等待某事,比如 I/O,就可以认为它是可运行的。可运行的线程将很快被安排在某个时间点执行。无论这是作为一个简单的队列还是更复杂的东西来实现,同样是特定于操作系统和硬件的。您可以将阻塞线程集视为一个集合,而不是一个严格有序的队列。

请注意,在单处理器系统上,此处定义的异步程序等效于线程程序。