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