从多个线程返回数据与累积响应

Posted

技术标签:

【中文标题】从多个线程返回数据与累积响应【英文标题】:Returning data from multiple threads Vs accumulating responses 【发布时间】:2018-01-13 21:26:31 【问题描述】:

我正在做一个简单的项目,该项目将发送多个 HTTP 请求以检索一些数据,解析来自每个 URL 的响应,并返回包含原始 URL 和有关数据的一些信息的响应(线程使用的原因显然是多个 HTTP 请求)。 如果有适合这种情况的最佳实践,我正在徘徊,这是我想到的选项: 1. 让每个线程发送一个 HTTP 请求。解析数据以获取所需信息并返回信息本身(通过Future<SomeDataType>,或在线程完成后进行简单的DataType getInformation() 调用),然后在原始线程中创建 URL-SomeDataType 对 2. 让每个线程接受一个同步列表/映射的附加参数,线程会将 URL-Information 对添加到其中(列表/映射的相同实例将在所有线程之间共享)。 3. 不太可能的选项 - 让每个线程只提取信息,然后以 1/2 中提到的任何一种方式返回,而不是在主线程中解析所有信息(这会降低性能但需要几乎 0 的同步处理,即不错)

是否有针对类似情况的最佳做法? 谢谢!

【问题讨论】:

选项 2 和 3 从同步的角度来看是等效的。没有区别 - 从请求或处理的数据中传输所有数据。第一个选项既复杂又缓慢。 【参考方案1】:

在我看来,选项 1 是最简洁的,并且符合最佳实践。实现它的首选方法是使用执行器框架(线程池和 Callables)。选择的理由——

    关注点分离 - 每个线程独立返回其工作的结果。之后,主线程的工作就是获取该结果并以它喜欢的方式进一步处理它(例如,将它放在地图中或将其合并到其他东西中)。将来,如果您找到了一种更好/更简洁的方法来聚合结果 - 这种变化很可能不会影响工作线程本身的工作或返回。

    选项 2 将涉及不必要的同步(尽管您可以使用 ConcurrentHashMap 使其最小化)。更大的问题 - 它混合了主线程和工作线程之间的关注点。工作线程现在“知道”一点关于结果的处理(他们关心的应该只是 - 获取结果)

    如您所说,选项 3 会降低性能。如果每个线程获取的信息彼此独立,则让每个线程解析该信息然后返回它是有意义的。

【讨论】:

以上是关于从多个线程返回数据与累积响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 Highcharts 从包含单个降雨数据的系列中创建响应式累积降雨图

想在 uitablelview 中只返回 1 个单元格,但由于 json 响应,显示了多个单元格

jmeter断言为整数怎么表达

pythonsocket服务端响应多个返回

iOS:在多个后台线程完成之前不要从函数返回

从 sql 读取和累积数据的更好方法