我在我的应用程序中使用插件: Grails CSV Plugin和Grails 2.5.3。我需要实现并发功能,例如:GPars,但我不知道该怎么做。
现在,配置是顺序处理。我的代码片段示例:
谢谢。
我在我的应用程序中使用插件: Grails CSV Plugin和Grails 2.5.3。我需要实现并发功能,例如:GPars,但我不知道该怎么做。
现在,配置是顺序处理。我的代码片段示例:
谢谢。
在这种情况下实现并发可能不会给您带来太多好处。这真的取决于瓶颈在哪里。例如,如果瓶颈在于读取 CSV 文件,则优势不大,因为文件只能按顺序读取。有了这个,这是我能想到的最简单的例子:
import groovyx.gpars.GParsPool
def tokens = csvFileLoad.inputStream.toCsvReader(['separatorChar': ';', 'charset': 'UTF-8', 'skipLines': 1]).readAll()
def failedSaves = GParsPool.withPool {
tokens.parallel
.map { it[0].trim() }
.filter { !Department.findByName(it) }
.map { new Department(name: it) }
.map { customImportService.saveRecordCSVDepartment(it) }
.map { it ? 0 : 1 }
.sum()
}
if(failedSaves > 0) transactionStatus.setRollbackOnly()
如您所见,首先读取整个文件;因此是主要瓶颈。大多数处理与map()
、filter()
和sum()
方法同时完成。Department
最后,如果任何s 未能保存,则事务将回滚。
注意:我选择使用map()
-sum()
对而不是 usinganyParallel()
来避免必须将生成的并行数组转换map()
为常规 Groovy 集合,执行anyParallel()
,它会创建一个并行数组,然后将其转换回 Groovy 集合。
正如我在示例中已经提到的,在并发执行开始之前首先完全读取 CSV 文件。它还会尝试保存所有Department
实例,即使其中一个实例保存失败。您可能想要(这就是您所展示的)或不想要。