试图理解非阻塞?

时间:2016-09-22 09:17:41

标签: design-patterns architecture

我一直在做一些研究,并且明白非阻塞方法是一种方法,如果返回时间太长也不会阻止它的调用线程 - 换句话说,它会立即返回一些东西。那么,如果它没有东西可以返回,它会返回什么?

3 个答案:

答案 0 :(得分:1)

  

所以,如果它没有东西可以返回,它会返回什么?

无。函数几乎不能在所有语言中返回任何内容 例如,在C ++中void f() { return; }是函数的有效定义。

无论如何,通常在回调通常是要走的过程中会看到这些功能 例如,libuv是一个几乎完全基于回调的C库 在这种情况下,您通常会传递回调对象(该对象主要取决于语言,例如它可以是函数指针(C), lambda函数仿函数(C ++),Function(JS)的实例或其他。
这样,被调用的方法可以自由地启动异步操作,并在通过回调完成后回调给调用者。

作为一个更具体的例子,假设您想要发出http请求 您可以执行阻塞调用来停止执行调用线程,直到响应到达,然后它将数据作为您调用的函数的返回值返回。 否则,您可以设计一个接受回调的函数,启动http调用并返回。无论何时收到响应,都将异步调用您的回调。

答案 1 :(得分:1)

通常在非阻塞模式中,处理程序(可能是函数或事件)用于在调用者和被调用者之间进行通信。当调用者进行非阻塞调用时,它要么传递该处理程序,要么已经与被调用者共享它。被调用者立即返回一些状态,如正在进行或可能为null。每当被调用者完成该工作时,它就会调用处理程序状态,并且调用者通过它来了解进度。

答案 2 :(得分:1)

非阻塞方法将接受回调,或触发事件,或返回“future”,或使用其他异步延续机制(例如C#6中的async / await )。

所以,你可能有:

void Process(Action<Data> whenFinishedInvokeThis)
{
    Task.Run(() => 
    {
         var data = DoSomeLongCalculation();
         whenFinishedInvokeThis(data);
    });
}

或者:

public event Action<Data> Finished;
void Process()
{
    Task.Run(() => 
    {
         var data = DoSomeLongCalculation();
         Finished?.Invoke(data);
    });
}

或者:

Task<Data> Process()
{
    return Task.Run(DoSomeLongCalculation);
}

或者:

async Task<Data> Process() 
{
    return await Task.Run(DoSomeLongCalculation);
}