Asynchronous 异步和非阻塞调用?也在阻塞和同步之间

Asynchronous 异步和非阻塞调用?也在阻塞和同步之间,asynchronous,blocking,synchronous,Asynchronous,Blocking,Synchronous,异步调用和非阻塞调用之间有什么区别?另外,在阻塞调用和同步调用之间(请举例)?它们仅在拼写上有所不同。它们所指的内容没有区别。从技术角度来说,你可以说它们的侧重点不同。非阻塞指的是控制流(它不阻塞)。异步指的是处理事件\数据时(不同步)。在许多情况下,它们是同一事物的不同名称,但在某些上下文中它们是完全不同的。这要看情况而定。在整个软件行业中,术语的应用方式并不完全一致 例如,在经典的sockets API中,非阻塞套接字只是立即返回一条特殊的“将阻塞”错误消息,而阻塞套接字则会阻塞。您必须使用

异步调用和非阻塞调用之间有什么区别?另外,在阻塞调用和同步调用之间(请举例)?

它们仅在拼写上有所不同。它们所指的内容没有区别。从技术角度来说,你可以说它们的侧重点不同。非阻塞指的是控制流(它不阻塞)。异步指的是处理事件\数据时(不同步)。

在许多情况下,它们是同一事物的不同名称,但在某些上下文中它们是完全不同的。这要看情况而定。在整个软件行业中,术语的应用方式并不完全一致

例如,在经典的sockets API中,非阻塞套接字只是立即返回一条特殊的“将阻塞”错误消息,而阻塞套接字则会阻塞。您必须使用一个单独的功能,如
select
poll
,以确定何时是重试的好时机

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

所以他们的意思并不总是一样的。要提取套接字示例,我们可以说:

  • 阻塞和同步的意思是一样的:你调用API,它会挂起线程,直到它得到某种答案并返回给你
  • 非阻塞意味着,如果不能快速返回答案,API将立即返回错误,而不执行其他操作。因此,必须有一些相关的方法来查询API是否已准备好被调用(即,以有效的方式模拟等待,以避免在紧循环中进行手动轮询)
  • 异步意味着API总是立即返回,已经开始了“后台”工作来满足您的请求,因此必须有一些相关的方法来获得结果
      • 异步指的是并行完成的事情,比如说是另一个线程
      • 非阻塞通常指轮询,即检查给定条件是否成立(套接字可读,设备有更多数据等)

        • 非阻塞:此函数在堆栈上时不会等待


          异步:在函数调用离开堆栈后,可以代表函数调用继续工作

          ,从大量不同(通常是相互排斥的)答案中可以看出,这取决于您询问的对象。在某些领域,这些术语是同义词。或者,它们可能各自引用两个类似的概念:

          • 一种解释是,调用将在后台执行一些基本上不受监督的操作,以使程序不受不需要控制的冗长过程的阻碍。播放音频可能就是一个例子——一个程序可以调用一个函数来播放(比如)mp3,从那时起,它可以继续进行其他事情,同时让操作系统来管理在声音硬件上呈现音频的过程
          • 另一种解释是,调用将执行程序需要监视的操作,但将允许大多数进程在后台发生,只在进程的关键点通知程序。例如,异步文件IO可能就是一个例子—程序向操作系统提供一个缓冲区以写入文件,操作系统仅在操作完成或发生错误时通知程序
          在这两种情况下,目的都是为了让程序在等待缓慢的进程完成时不会被阻塞-程序预期如何响应是唯一真正的区别。哪一个术语指的是从一个程序员到另一个程序员,从一种语言到另一种语言,或从一个平台到另一个平台的变化。或者,这些术语可能指的是完全不同的概念(例如在线程编程中使用同步/异步)


          抱歉,但我认为没有一个正确答案是全局正确的。

          阻塞:在原语(同步或异步)处理完成后,控件返回调用进程


          非阻塞:调用后控件立即返回进程

          将此问题放在NIO和NIO的上下文中。2在java 7中,异步IO比非阻塞更高级一步。 对于java NIO非阻塞调用,可以通过调用
          AbstractSelectableChannel.configureBlocking(false)
          来设置所有通道(SocketChannel、ServerSocketChannel、FileChannel等)。 但是,在这些IO调用返回后,您可能仍然需要控制检查,如是否以及何时再次读/写等。
          比如说,

          while(!isdataough()){
          socketchannel.read(inputBuffer);
          //做点别的,然后再读一遍
          }
          
          有了Java7中的异步api,这些控件可以以更通用的方式制作。 两种方法之一是使用
          CompletionHandler
          。请注意,
          read
          调用都是非阻塞的

          asyncsocket.read(inputBuffer,60,TimeUnit.SECONDS/*60秒表示超时*/,,
          新的CompletionHandler(){
          公共无效已完成(整数结果,对象附件){…}
          public void失败(可丢弃的e,对象附件){…}
          }
          }
          
          阻塞调用:控件仅在调用完成时返回

          非阻塞调用:控件立即返回。稍后操作系统会以某种方式通知进程调用已完成



          同步程序:使用B
          // thread X
          while (true)
          {
              msg = recv(Y, NON_BLOCKING_FLAG);
              if (msg is not empty)
              {
                  break;
              }
              else
              {
                  sleep(2000); // 2 sec
              }
          }
          
          // thread Y
          // prepare the book for X
          send(X, book);
          
          // Module X = Module X1 + Module X2
          // Module X1
          while (true)
          {
              msg = recv(many_other_modules, NON_BLOCKING_FLAG);
              if (msg is not null)
              {
                  if (msg == "done")
                  {
                      break;
                  }
                  // create a thread to process msg
              }
              else
              {
                  sleep(2000); // 2 sec
              }
          }
          // Module X2
          broadcast("I got the book from Y");
          
          
          // Module Y
          // prepare the book for X
          send(X, book);