[英]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.