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 报告大量异步函数的状态并等待完成 的相关文章

随机推荐