我需要使用名为check_access
的函数遍历大约100个s3桶的列表,检查我是否有权访问。每个调用都是长时间运行的,因此在循环中执行此操作需要很长时间。大部分时间都在等待Web请求回来。
我正在尝试使用async
库来加快速度。
我最初的失败尝试看起来像这样:
# buckets is a vector of bucket names
afun <- async(function(buckets) {
check_access_async <- async(function(bucket_name) {
aws.s3::bucket_exists(bucket_name)[1]
})
r1 <- check_access_async(buckets[1])
r2 <- check_access_async(buckets[2])
await_all(r1,r2)
})
system.time(result <- synchronise(afun(buckets)))
使用system.time
检查执行时间表明上述代码实际上没有任何内容 - 所以我开始在async http functions的实现中查看文档。
这表明我需要创建一个延迟函数,以获得并行化的好处。这是我目前的尝试,但它仍然不起作用:
afun2 <- async(function(buckets) {
mydeferred1 <- async::deferred$new(function(resolve, reject) {
hasaccess <- aws.s3::bucket_exists(buckets[1])[1]
resolve(hasaccess)
})
mydeferred2 <- async::deferred$new(function(resolve, reject) {
hasaccess <- aws.s3::bucket_exists(buckets[2])[1]
resolve(hasaccess)
})
await_all(mydeferred1, mydeferred2)
})
system.time(synchronise(afun2(buckets)))
显然,一旦我开始工作,我会将所有内容写入循环/应用语句。目前我只想弄清楚'延迟'的正确用法。
我非常感谢有关如何正确使用该库的建议。
P.S。我也尝试使用parallel
来解决这个问题。我得到了它的工作,但是启动线程的延迟意味着它没有像预期的那样节省时间。