如何使用GPars和Groovy从并行运行的任务中收集数据

时间:2017-12-08 02:59:01

标签: grails groovy gpars

GPars文档说我们不应该这样做:

def thumbnails = []
images.eachParallel {thumbnails << it.thumbnail} // Concurrently accessing a not-thread-safe collection of thumbnails? Don't do this!
  

来源:http://www.gpars.org/webapp/guide/index.html#_avoid_side_effects_in_functions

我想编写一种类似的代码,其中并行执行方法需要写入公共List。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

您显示的代码不是线程安全的 - 多个不同的线程会尝试并行添加元素到列表中。可能发生的情况是两个(或更多)线程尝试在同一索引处添加元素,因此最后一个线程实际上将替换前一个线程所执行的操作。

请尝试以下操作:

def thumbnails = images.collectParallel {it.thumbnail}

def thumbnails = images.parallel.map {it.thumbnail}

它具有线程安全性,因此您可以获得所有缩略图的列表。