我们已经知道了同步的基本定义和一些示例,那么让我们拓宽一-下讨论,看看应用中的同步调用和异步调用。同步调用是在调用返回时才能完全执行它们的动作。如果一个方法被调用了,控制权被转给该方法来行使,那么只有当该方法完成了自己要执行的操作,成功地返回了或者返回有错时,应用中调用该方法的地方才会重新得到控制权。换而言之,同步方法先被调用,然后它们执行操作,当它们完成时,会返还控制权。
作为同步方法的一个示例,让我们来看看AllScale公司的HRM服务中的一个方法query_exec。该方法用于构建和执行一个动态的数据库查询。query_exec方法中的一个步骤是建立一一个数据库连接。在得到这个数据库连接任务成功完成了的明确确认之前,query.exec方法不会继续执行。这样做既浪费资源,又浪费时间。如果数据库不可用,那么该应用就不应该把时间浪费在创建查询、等待数据库恢复可用上。事实上,如果数据库不可用了,,看看如何划分数据库来提高它的可用性。尽管如此,这是个说明同步调用是如何工作的例子。因此,发起调用的方法会被暂停,直到被调用的进程返回结果之前,它是不能完成的。
另一个说明同步性的非技术示例是两个人之间的沟通,这可以是面对面,也可以是通过电话。如果这两个人都忙于有意义的谈话,那么就不太可能发生其他的动作。其中一人如果不停止与另一人的谈话,那么很难再与第三个人开始交谈。电话会直占线,直到两个人中的一个或者两者挂断了电话。
与同步方法或进程相对的是异步方法。在异步方法调用中,会在一个新的线程中调用一个方法,这个方法会立即把控制权返回给调用它的线程。描述异步方法调用的设计模式叫作异步设计或异步方法调用(AMI)。这个异步调用的方法会在另一个线程中继续执行,或成功结束或出现错误,但都不会再与发起它的线程有进一步的交互。让我们再来看看AllScale公司的queryexec方法。在调用了同步方法,建立数据库连接后,该方法需要准备和执行查询了。在HRM系统中,AllScale公司有一个监控框架,能够用来观察所有查询的持续时间以及查询是否成功了,这个框架采用了异步调用方法startquery_time和endquerytime。这些方法会把一个系统时间存储在内存中,等待调用的结束,以便计算查询的持续时间。然后这个持续时间会被存储在一个监控数据
库中,通过查询这个数据库,可以根据查询运行时间的长短了解系统运行状况如何。虽然监控查询的性能很重要,但让查询真正服务于用户的请求更为重要。因此,startquerytime和lendquery_time这些方法是以异步模式调用的。如果它们运行成功并返回了结果,那么AllScale公司的运营团队和软件开发团队就能从监控数据库中得到查询时间。即使监控调用失败了,或者连接监控数据库花了20秒的时间,这些团队都不会在乎。用户的查询仍然在运行,它们根本不关心这些异步调用。
回到我们人际沟通的示例,电子邮件是个异步通信的很好例子。你写了电子邮件并把它发出去后,可以立即去做其他的事情,可以写另一封邮件,也可以打一轮高尔夫球或者其他什么事情。当回复的邮件在一个合适的时候到达时,你可以阅读这封回复的邮件,并可能发出另一封邮件,作为回复。这个网站设计的沟通链除了需要为处理沟通和写回信花费点时间之外,不会妨碍发送者和接收者的任何其他活动。
>>> 查看《网站设计中同步调用,还是异步调用?》更多相关资讯 <<<
本文地址:http://www.phpweb.com.cn/news/html/3899.html