什么是非阻塞 Rest 客户端?

512*_*009 5 rest asynchronous nonblocking jersey-2.0

我们已经阅读了很多内容来解释非阻塞和异步 I/O 之间的细微差别,但大多数似乎都与服务器端编程有关。这似乎也有道理。但非阻塞与异步 I/O 是否与 Rest Client 相关?

在网上花了很多时间,但恐怕我仍然无法理解其中的区别,或者更确切地说,无法理解拥有非阻塞 Rest 客户端的重要性。我更关心泽西岛客户。是的,API 表示它支持异步客户端,并且可以使用 Future.isDone() 避免对 Future 对象的阻塞“get”调用(参考: https: //jersey.java.net/documentation/latest/async)。 html)但是如果我的 Rest 客户端发出 Post 请求,如何处理?它只是异步的还是异步且非阻塞的?如果有人能帮助我获得见解,我将不胜感激。

感谢致敬

Mel*_*per 2

我建议阅读Microsoft 关于该主题的这篇文章。

无论发生在服务器端还是客户端,术语“非阻塞”实际上意味着相同的事情。正如上面的文章所指出的,阻塞意味着您进行调用的线程停止处理,直到调用完成。本文中描述的任务异步模式使得等待 Rest 调用而不是阻塞线程成为可能。一般来说,如果一个方法返回一个Task,并且该方法带有async后缀,那么它将是一个非阻塞调用。这意味着它可以与其他调用同时运行,因此调用不需要按顺序运行。它们可以并行运行。

下面是一个示例,其中并行进行非阻塞休息调用并等待,以便它们不会相互阻塞。没有并行的简单 for 循环将实现相同的结果,因为它会按顺序启动调用,但不会阻塞每个调用。

var tasks = new List<Task<Response<Person>>>();

var client = clientFactory.CreateClient();

for (var i = 0; i < 100; i++)
{
    tasks.Add(client.GetAsync<Person>(new Uri("JsonPerson", UriKind.Relative)));
}

var results = await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)

完整代码