R异步库,用于并行化长时间运行的Web请求

时间:2017-12-05 10:13:07

标签: r asynchronous

我需要使用名为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来解决这个问题。我得到了它的工作,但是启动线程的延迟意味着它没有像预期的那样节省时间。

0 个答案:

没有答案