什么是非阻塞的Rest Client?

问题描述 投票:2回答:1

经历了很多解释非阻塞和异步I / O之间的细微差别的东西,但是大多数似乎与服务器端编程有关。这似乎也很有意义。但是就Rest Client而言,非阻塞与异步I / O是否具有相关性?

[已经花了很多时间在网上,但是,恐怕仍然无法把握拥有畅通无阻的Rest Client的区别或意义。我更关心Jersey客户。是的,API表示它支持异步客户端,并且可以使用Future.isDone()(ref:https://jersey.java.net/documentation/latest/async.html)避免对Future对象进行阻塞的“ get”调用,但是如果我的Rest Client发出Post请求,那该怎么做?处理?它只是异步的还是异步且非阻塞的?如果有人可以帮助我提供见解,将不胜感激。

感谢和问候

rest asynchronous nonblocking jersey-2.0
1个回答
0
投票

我建议从Microsoft主题中阅读此article

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

这里是一个并行执行并等待非阻塞的REST调用,以使它们不会彼此阻塞的示例。一个简单的没有并行的for循环将获得相同的结果,因为它将按顺序启动调用,但不会在每次调用时阻塞。

var tasks = new List<Task<Response<Person>>>();
const int maxCalls = 100;

var client = clientFactory.CreateClient();

Parallel.For(0, maxCalls, (i) =>
{
    tasks.Add(client.GetAsync<Person>(new Uri("JsonPerson", UriKind.Relative)));
});

var results = await Task.WhenAll(tasks);

Full code

© www.soinside.com 2019 - 2024. All rights reserved.