线程与异步

时间:2010-10-26 13:20:19

标签: asynchronous twisted

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

然而,文章提到了以下几点。

  1. 只要有I / O,异步程序就会通过在任务之间切换来超越同步程序。
  2. 线程由操作系统管理。
  3. 我记得通过在Ready-Queue和Waiting-Queue(以及其他队列之间)之间移动TCB来读取线程由操作系统管理。在这种情况下,线程不会浪费时间等待吗?

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

6 个答案:

答案 0 :(得分:62)

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

答案 1 :(得分:9)

答案 2 :(得分:4)

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

一旦线程完成等待某事,比如说I / O,就可以认为它是可运行的。可运行的线程将很快安排在某个时刻执行。无论是实现为简单队列还是更复杂的实现,都是OS和硬件特定的。您可以将阻塞线程集视为一个集合,而不是严格排序的队列。

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

答案 3 :(得分:2)

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

  2. 假设您有2个任务,涉及IO(在多处理器计算机上)。 在这种情况下,Async和Threads执行或多或少相同(性能 可能会因核心数量,日程安排,流程密集程度而异 任务等)。此外,Async占用的资源更少,开销更低 在多线程程序上编程不太复杂。

  3. 它是如何工作的?    线程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

    希望这有用。

答案 4 :(得分:0)

异步I / O意味着驱动程序中已经有一个执行该作业的线程,因此您正在复制功能并产生一些开销。另一方面,通常没有记录驱动程序线程的确切行为,在复杂的情况下,当您想要控制超时/取消/启动/停止行为,与其他线程同步时,实现自己的线程是有意义的。在同步条款中,有时也更容易推理。

答案 5 :(得分:0)

请参阅http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

但是,在用户线程(而不是内核线程)或光纤中使用阻塞系统调用可能会有问题。如果用户线程或光纤执行阻塞的系统调用,则进程中的其他用户线程和光纤将无法运行,直到系统调用返回。此问题的典型示例是执行I / O时:编写大多数程序以同步执行I / O.启动I / O操作时,将进行系统调用,直到I / O操作完成后才会返回。在此期间,整个过程被内核“阻止”并且无法运行,这使得同一进程中的其他用户线程和光纤无法执行。

根据这一点,您的整个进程可能会被阻止,并且在IO中阻塞一个线程时不会安排任何线程。我认为这是特定于操作系统的,并不总是保持不变。