繁体   English   中英

Grails CSV 插件 - 并发

[英]Grails CSV Plugin - Concurrency

我正在使用插件: Grails CSV Plugin in my application with 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的任何一个未能保存,则事务将回滚。

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

改进

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM