-1

我在我的应用程序中使用插件: Grails CSV Plugin和Grails 2.5.3。我需要实现并发功能,例如:GPars,但我不知道该怎么做。

现在,配置是顺序处理。我的代码片段示例:

谢谢。

4

1 回答 1

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最后,如果任何s 未能保存,则事务将回滚。

注意:我选择使用map()-sum()对而不是 usinganyParallel()来避免必须将生成的并行数组转换map()为常规 Groovy 集合,执行anyParallel(),它会创建一个并行数组,然后将其转换回 Groovy 集合。

改进

正如我在示例中已经提到的,在并发执行开始之前首先完全读取 CSV 文件。它还会尝试保存所有Department实例,即使其中一个实例保存失败。您可能想要(这就是您所展示的)或不想要。

于 2016-05-09T19:39:55.283 回答