从多个线程返回数据与累积响应
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 从包含单个降雨数据的系列中创建响应式累积降雨图