我正在使用 Grails 2.5.3 在我的应用程序中使用插件: Grails CSV插件。 我需要实现并发功能,例如: GPars ,但我不知道如何做到这一点。
现在,配置是顺序处理。我的代码片段示例:
感谢。
答案 0 :(得分:1)
在这种情况下实现并发可能不会带来很多好处。这实际上取决于瓶颈在哪里。例如,如果瓶颈在于读取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
中的任何一个未能保存,则回滚事务。
注意:我选择使用map()
- sum()
对,而不是使用anyParallel()
,以避免将map()
生成的并行数组转换为常规Groovy集合,执行anyParallel()
,它创建一个并行数组,然后将其转换回Groovy集合。
正如我在我的示例中已经提到的,在并发执行开始之前,首先完全读取CSV文件。它还会尝试保存所有Department
实例,即使一个实例无法保存。你可能想要(也就是你所展示的)。