GPars 报告大量异步函数的状态并等待完成

2024-05-03

我有一个解析器,在收集一行数据后,我想触发一个 aync 函数并让它处理该行,同时主线程继续运行并获取下一行。

我看过这个帖子:在 Groovy 中如何同时执行两个任务并等待结果? https://stackoverflow.com/questions/11529521/how-do-i-execute-two-tasks-simultaneously-and-wait-for-the-results-in-groovy?rq=1但我不确定这是否是适合我的情况的最佳解决方案。

我想要做的是,读取所有行后,等待所有异步函数完成,然后再继续。使用 Promise 集合的一个问题是该列表可能很大(100,000+)。

另外,我想随时报告状态。最后,我不确定我是否想要自动等待超时(例如在 get() 上),因为文件可能很大,但是,我确实希望允许用户出于各种原因终止进程。

所以我现在所做的是记录解析的行数(因为它们通过rowsRead),然后使用 Promise 中的回调来记录正在完成处理的另一行,如下所示:

def promise = processRow(row)
promise.whenBound {
    rowsProcessed.incrementAndGet()
}

Where 已处理行数是一个原子整数。

然后,在工作表末尾调用的代码中,在完成所有解析并且等待处理完成后,我将执行以下操作:

boolean test = true
while (test) {
    Thread.sleep(1000)  // No need to pound the CPU with this check
    println "read: ${sheet.rowsRead}, processed: ${sheet.rowsProcessed.get()}"
    if (sheet.rowsProcessed.get() == sheet.rowsRead) {
        test = false
    }
}

令人高兴的是,我这里没有大量的 Promise 对象 - 只是一个简单的计数来检查。但我不确定经常睡觉是否与检查每个 Promise() 对象上的 get() 一样有效。

所以,我的问题是:

  1. 如果我使用 Promises 集合,如果执行上面 while 循环的线程被 Thread.interrupt() 中断, get() 会做出反应并返回吗?
  2. 使用 Promise 集合并对每个 Promise 调用 get() 会比尝试睡眠和经常检查更有效吗?
  3. 还有其他我没有考虑过的更好的方法吗?

Thanks!


  1. 如果等待(主)线程被中断,调用 allPromises*.get() 将抛出 InterruptedException
  2. 是的,无论如何,承诺已经创建,因此在我看来,将它们分组在列表中不应施加额外的内存要求。
  3. 在我看来,使用 CountDownLanch 或 Phaser 的建议解决方案比使用繁忙等待更合适。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPars 报告大量异步函数的状态并等待完成 的相关文章

  • 与赋值“=”和括号 { } 的使用混淆

    我是 gradle 的新手 对于 groovy 也是如此 我几乎不了解某些概念 并且真的不知道它是否与 groovy 或 gradle 相关 以及需要 google 哪些关键字来获取帮助 我经常被这样的事情绊倒 android some c
  • 使用“评估”功能。为什么它不起作用?

    这段代码 evaluate def test println Test is successful test 结果异常 致命 没有方法签名 script1409644336796288198097 test 适用于参数类型 值 可能的解决方
  • 修改String字段的getter的返回值

    假设我的应用程序中有一些类似于域类的类 其中包含一些 Long Double Date 和 String 字段 这些类使用一些公共字段和一些公共方法扩展了基类 每当我访问 String 类字段 通过 getter 时 我想对返回的值进行一些
  • 抑制 Jenkins 文件中的管道输出

    当我在詹金斯上运行构建时 它总是在执行詹金斯步骤时打印管道 控制台当前输出 Build context CI clean app clean BUILD SUCCESSFUL in 22s 2 actionable tasks 2 exec
  • Groovy 元编程 - 将静态方法添加到 Object.metaClass

    我遇到了无法解决的 Groovy 元编程问题 将静态方法 foo 添加到类 FooBar 时 FooBar foo 按预期工作 FooBar metaClass static foo println hello FooBar foo 但是
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 我怎样才能拦截从 Java 到 Groovy 的调用——或者轻松地模拟它

    我本来希望使用 groovy 的 invokeMethod 来做到这一点 但事实证明 当您从 Java 调用 Groovy 时 不会调用 invokeMethod 但否则它会完美地工作 我有一个案例 我将 Groovy 类提交给 Java
  • 使用动态对象组配置 gradle 插件扩展的正确方法

    我正在尝试编写自己的 gradle 插件 它需要能够配置一组对象 这些对象的数量以及它们的名称取决于用户 用于创建具有高级可定制性的自定义 gradle 插件的 doco 相当差 它提到project container 方法来做这种事情
  • Grails GORM 和枚举

    我在 Grails 中使用枚举时遇到问题 我尝试在 grails 域对象中使用枚举 code package it xxx tools kanban import java util Date class Task String name
  • 升级eclipse后Groovy失败

    最近升级到 Eclipse 2020 12 4 18 0 从那以后 Groovy 就不再工作了 升级了 Groovy 没有任何改进 现在正在运行 展开所有 已安装的内容 树 Eclipse Groovy 开发工具 org codehaus
  • 如何生成源文件并用gradle编译

    我有一个类似于以下内容的 gradle 构建脚本 apply plugin war task genSources lt lt here I generate some java files making sure that source
  • 如何将用户输入密码与凭据密码进行比较

    我有一个脚本化管道 它使用以下命令请求用户的密码input函数并将其与用户保存的凭据密码进行比较 如果用户输入的是一个类型string然后就可以了 但是 当我将输入类型更改为password 因此当用户键入它时 它在屏幕上不可见 它会失败并
  • 如何使用 Groovy 获取没有继承方法的类的所有方法名称?

    Question 如果没有继承的方法 如何获取类的所有方法的名称 Example def methods MyClass methods collect it name println methods each println it ass
  • 如何在 Gradle 中使用 if else 条件

    有人可以告诉我如何在 gradle 脚本中编写 if else 条件吗 我的意思是我有两种不同类型的 zip 文件 一种是 LiceseGenerator 4 0 0 58 另一种是 CLI 4 0 0 60 我的部署脚本工作正常 但我使用
  • 不带破折号的 CliBuilder 参数

    使用 Groovy CliBuilder 理想情况下我希望有一个命令行 如下所示 MyProgram groovy CommandName arg1 arg2 arg3 是否可以使用 CliBuilder 解析提取 CommandName
  • Grails 测试中的模拟配置

    在 Grails 2 0 X 之前 可以使用mockConfig测试扩展的基类提供的方法 然而 在 Grails 2 0 X 中 建议测试类使用 TestFormixin 而不是扩展基类 这个 mixin 似乎没有提供任何与mockConf
  • 在 mule 中使用 groovy 表达式来限制 IP

    我在 mule 中使用 cxf 创建了一个代理服务 我的 mule 版本是 3 3 0 CE 现在 我想在使用代理服务创建的 wsdl 中添加限制 我的限制不应允许他们看到我的 wsdl 的每个 IP 为此 我找到了 Groovy 表达式和
  • Groovy:验证 JSON 字符串

    我需要检查 Groovy 中的字符串是否为有效的 JSON 我的第一个想法就是把它发送出去new JsonSlurper parseText myString 并且 如果没有例外 就假设它是正确的 然而 我发现 Groovy 很乐意接受尾随
  • 在 Grails 域对象中维护自引用多对多关系的双方

    我在让多对多关系在 grails 中工作时遇到一些问题 以下内容是否有明显错误 class Person static hasMany friends Person static mappedBy friends friends Strin
  • 无法在 Intellij 上创建 Groove 脚本 - @NotNull 参数的参数

    我正在尝试开始学习 Groovy 以便在 JIRA 上使用 ScriptRunner 执行 API 调用 所以我从基础开始 我的问题是我什至无法使用 Intellij 创建 Groovy 脚本 在项目创建时它选择Groovy并选择项目SDK

随机推荐