twisted前言

模型

我们将首先回顾两个(希望的)熟悉的模型,以便与异步模型进行对比。作为说明,我们将想象一个程序,由三个概念上不同的任务组成,必须执行完成该程序。稍后我们会更加具体地完成这些任务,但是现在我们不会说什么,除了程序必须执行它们。注意我在非技术意义上使用“需要做的事情”的“任务”。

我们将看到的第一个模型是单线程同步模型,如图1所示:

图1:同步模型 图1:同步模型

这是最简单的编程风格。每个任务一次执行一次,一次完成之前另一个完成。而且如果这些任务总是以一个确定的顺序执行,那么后来的任务的实现可以假定所有早期的任务都没有错误地完成,所有的输出都可以使用 - 逻辑的一个明确的简化。

我们可以将同步模型与另一个对比,图2所示的线程模型:

图2:线程模型 图2:线程模型

在这个模型中,每个任务都在单独的控制线程中执行。线程由操作系统管理,并且可以在具有多个处理器或多个核心的系统上真正并行运行,或者可以在单个处理器上交错在一起。关键是,在线程模型中,执行的细节由操作系统处理,程序员根据可能同时运行的独立指令流来简单地思考。虽然图很简单,但实际上线程程序可能相当复杂,因为线程需要彼此协调。线程通信和协调是一个高级的编程主题,可能难以正确。

一些程序使用多个进程而不是多个线程实现并行。虽然编程细节不同,但为了我们的目的,它是与图2相同的模型。

现在我们可以在图3中介绍异步模型:

图3:异步模型 图3:异步模型

在这个模型中,任务彼此交错,但是在一个单独的控制线程中。这比线程情况更简单,因为程序员总是知道当一个任务执行时,另一个任务不是。尽管在单处理器系统中,线程程序也将以交错模式执行,但使用线程的程序员仍然应该考虑图2而不是图3,以免程序在移动到多处理器系统时工作不正确。但是,即使在多处理器系统上,单线程异步系统也将始终以交错方式执行。

异步和线程模型之间有另一个区别。在线程系统中,挂起一个线程并执行另一个线程的决定大部分不在程序员的控制之内。相反,它是在操作系统的控制之下,程序员必须假设一个线程可能被暂停,几乎任何时候都被替换为另一个线程。相反,在异步模型下,任务将继续运行,直到它明确放弃对其他任务的控制。这是从螺纹壳体的进一步简化。

请注意,可以混合异步和线程模型,并在同一系统中使用。但是对于大多数这个介绍,我们将坚持使用“一般的香草”异步系统,具有一个控制线程。

动机

我们已经看到,异步模型比线程模型简单,因为有一个指令流,任务明确放弃控制而不是任意挂起。但异步模式比同步情况明显更复杂。程序员必须将每个任务组织为间歇执行的较小步骤序列。如果一个任务使用另一个任务的输出,则依赖任务必须被写入以将它的输入作为一系列位和片而不是所有的一起接受。由于没有实际的并行性,所以从我们的图表中可以看出,异步程序只需要同步执行一次即可,因为异步程序可能会显示较差的引用位置

那么为什么要选择使用异步模型?至少有两个原因。首先,如果一个或多个任务负责实现人的接口,则通过将任务交错在一起,系统可以在“背景”中仍然执行其他工作的同时保持对用户输入的响应。所以当后台任务可能不会执行得更快的时候,系统对于使用它的人来说会更加愉快。

然而,有一个条件,在这种情况下,异步系统将在总体上更短的时间内执行其所有任务的意义上,优于同步的系统,有时候会显着地超过这种情况。当任务被迫等待或阻塞时这种情况成立,如图4所示:

图4:同步程序中的阻塞 图4:同步程序中的阻塞

在图中,灰色部分表示特定任务正在等待(阻塞)的时间段,因此无法进行任何进展。为什么会阻止任务?常见的原因是它正在等待执行I / O,将数据传输到外部设备或从外部设备传输数据。典型的CPU可以处理比磁盘或网络链路能够维持的数量级更快的数据传输速率。因此,正在执行大量I / O的同步程序将在磁盘或网络赶上时花费大量时间来阻止它。这样的同步程序也被称为阻塞程序。

请注意,图4,一个阻塞程序,看起来有点像图3,一个异步程序。这不是巧合。异步模型背后的基本思想是,异步程序在面对通常在同步程序中阻塞的任务时,将执行一些仍然可以取得进展的其他任务。所以一个异步程序只有在没有任务可以进展的时候才“阻止”,因而被称为非阻塞程序。并且从一个任务到另一个任务的每个切换对应于第一个任务完成,或者到达必须阻止的一个任务。通过大量潜在的阻止任务,异步程序可以通过花费较少的总体等待时间来优于同步程序,同时将大致相等的时间用于各个任务的实际工作。

与同步模型相比,异步模型在以下情况下表现最佳:

  1. 有大量的任务,所以有可能总是至少有一个任务可以取得进展。
  2. 这些任务执行大量I / O,导致同步程序在其他任务运行时浪费大量时间阻塞。
  3. 这些任务在很大程度上是彼此独立的,因此几乎不需要任务间通信(因此一个任务要等待另一个任务)。

这些条件几乎完美地表征了客户端 - 服务器环境中典型的繁忙的网络服务器(如Web服务器)。每个任务以一个接收请求和发送答复的形式表示一个具有I / O的客户端请求。客户端请求(主要是读取)在很大程度上是独立的。因此,网络服务器实现是异步模型的主要候选者,这就是Twisted首先是网络库的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值