gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:23:03 24 4
gpt4 key购买 nike

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

我看过这篇文章:How do I execute two tasks simultaneously and wait for the results in Groovy?但我不确定这是适合我情况的最佳解决方案。

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

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

所以我现在所做的是记录已解析的行数(因为它们是通过 rowsRead 发生的),然后使用 Promise 的回调来记录正在完成处理的另一行,就像这样:

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

其中 rowsProcessed 是一个 AtomicInteger。

然后在工作表末尾调用的代码中,在完成所有解析并等待处理完成后,我正在这样做:

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 对象 - 只是一个简单的计数来检查。但我不确定经常 sleep 是否与检查每个 Promise() 对象上的 get() 一样有效。

所以,我的问题是:

  1. 如果我改用 Promises 集合,如果执行上述 while 循环的线程被 Thread.interrupt() 中断,get() 会使用react并返回吗?
  2. 使用 Promises 的集合并在每个 Promises 上调用 get() 是否比尝试 sleep 和每隔一段时间检查更有效?
  3. 是否还有其他我没有考虑过的更好的方法?

谢谢!

最佳答案

  1. 如果等待的(主)线程被中断,调用 allPromises*.get() 将抛出 InterruptedException
  2. 是的,promise 无论如何都已创建,因此在我看来,将它们分组到一个列表中不应强加额外的内存要求。
  3. 在我看来,使用 CountDownLanch 或 Phaser 的建议解决方案比使用忙等待更合适。

关于groovy - GPars 报告大量异步函数的状态并等待完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com