异步与非

异步调用和非阻塞调用有什么区别? 还有阻塞和同步呼叫之间(请举例)?


在许多情况下,它们对于同一事物而言是不同的名称,但在某些情况下它们是完全不同的。 这取决于。 在整个软件行业中,术语不是以完全一致的方式应用的。

例如,在传统的套接字API中,非阻塞套接字就是一个只会立即返回一个特殊的“阻塞”错误消息,而阻塞套接字会被阻塞的套接字。 您必须使用单独的功能(如selectpoll来确定什么时候是重试的好时机。

但是异步套接字(如Windows套接字所支持的)或.NET中使用的异步IO模式更方便。 你调用一个方法来启动一个操作,当框架完成时,框架会回复你。 即使在这里,也有基本的区别。 异步Win32套接字通过传递Window消息将它们的结果“封送”到特定的GUI线程,而.NET异步IO是自由线程的(你不知道你的回调将被调用什么线程)。

所以他们并不总是意味着同样的事情。 为了提炼插座示例,我们可以说:

  • 阻塞和同步意味着同样的事情:你调用API,它会挂起线程,直到它有某种答案并将其返回给你。
  • 非阻塞意味着如果答案不能迅速返回,那么API会立即返回一个错误,而不会做任何其他事情。 因此,必须有一些相关的方法来查询API是否已准备好被调用(即,以高效的方式模拟等待,避免在紧密循环中进行手动轮询)。
  • 异步意味着API总是立即返回,开始“背景”努力来满足您的请求,所以必须有一些相关方式来获得结果。

  • 异步是指并行完成的东西,也就是另一个线程。
  • 非阻塞通常指轮询 ,即检查给定条件是否成立(套接字可读,设备具有更多数据等)

  • 正如你可以从大量不同的(而且往往是互斥的)答案中看到的,这取决于你问谁。 在某些领域,这些术语是同义词。 或者他们每个人都可以提到两个相似的概念:

  • 一种解释是调用会在后台基本无人监督的情况下执行某些操作,以便程序不会受到无需控制的冗长进程的阻碍。 播放音频可能就是一个例子 - 一个程序可以调用一个函数来播放(比如说)一个mp3,并且从这一点开始可以继续传递给其他的东西,同时将它留给OS来管理在声音硬件上渲染音频的过程。
  • 另一种解释是,这个调用会做一些程序需要监控的事情,但是这个过程的大部分过程只能在后台进行,只能在过程的关键点通知程序。 例如,异步文件IO可能是一个例子 - 程序向操作系统提供一个缓冲区以写入文件,操作系统只在操作完成或发生错误时通知程序。
  • 无论是哪种情况,其目的都是让程序不会被阻塞,等待一个缓慢的过程完成 - 程序如何响应是唯一真正的区别。 哪一个术语是指从程序员到程序员,语言到平台,还是从平台到平台。 或者这些术语可能指的是完全不同的概念(如使用与线程编程相关的同步/异步)。

    对不起,但我不相信有一个正确的答案是全球性的。

    链接地址: http://www.djcxy.com/p/50817.html

    上一篇: asynchronous vs non

    下一篇: Asynchronous and synchronous postback in ASP.NET