如何使用future::resolved判断promises::future_promises是否已完成?
检查promises::future_promise是否完成的方法
你遇到的问题是因为promises::future_promise()返回的是promise对象,而非future包的Future对象。直接用future::resolved()判断会误判——它检查的是promise自身的状态(promise创建后立即处于等待回调的"resolved"状态),而非底层异步任务的执行状态。
下面是两种可行的解决方法:
方法一:提取底层Future对象进行检查
future_promise内部会创建一个底层的Future对象,你可以通过.future属性获取它,再用future::resolved()判断任务是否完成:
future::plan(future::multisession) f <- function() { Sys.sleep(10) return(TRUE) } # 创建future_promise x <- promises::future_promise({ f() }) # 提取底层Future对象 x_underlying_future <- x$.future # 检查任务状态(初始为FALSE,10秒后变为TRUE) future::resolved(x_underlying_future) # 轮询等待的示例 while (!future::resolved(x_underlying_future)) { cat("异步任务仍在执行...\n") Sys.sleep(1) } cat("异步任务已完成!\n")
方法二:使用promise的回调机制(更符合异步编程范式)
如果不需要主动轮询,而是想在任务完成后自动执行操作,可以用promises::then()注册回调函数,避免轮询开销:
future::plan(future::multisession) f <- function() { Sys.sleep(10) return(TRUE) } # 创建future_promise并注册完成回调 x <- promises::future_promise({ f() }) %>% promises::then(function(result) { cat("异步任务完成,结果:", result, "\n") # 这里编写任务完成后的处理逻辑 }) # 主程序可以继续执行其他操作,无需阻塞等待 cat("主程序继续运行...\n")
内容的提问来源于stack exchange,提问作者Julien Navarre
相关产品推荐
相关产品推荐

