【问题标题】:What is a non-blocking Rest Client?什么是非阻塞 Rest Client?
【发布时间】:2014-09-03 13:17:55
【问题描述】:

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

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

感谢和问候

【问题讨论】:

  • REST 使用哪种底层协议?我不认为这些术语被 HTTP 计算在内,但我不是这个主题的专家。你能详细说明你的问题吗?

标签: rest asynchronous nonblocking jersey-2.0


【解决方案1】:

我建议阅读来自 Microsoft 的 article 关于该主题的文章。

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

这是一个示例,其中非阻塞的 rest 调用并行进行并等待,这样它们就不会相互阻塞。没有并行的简单 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);

Full code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2012-10-31
    • 2012-06-13
    • 2012-11-13
    • 2020-12-07
    • 2014-10-19
    相关资源
    最近更新 更多