在一个新线程中进行计算,并在后面的R中参考结果
在clojure中,我可以这样做:在一个新线程中进行计算,并在后面的R中参考结果,r,concurrency,clojure,R,Concurrency,Clojure,在clojure中,我可以这样做: (def x 在新线程中执行一些昂贵的计算 repl未被阻止,因此您可以继续执行其他操作 (未来 (做 (线程/睡眠500) 3.14))) ;; ... 做点别的 ;; 现在当你需要x的时候 ;; 只需预测未来,获得3.14 @x 在R中是否有类似的内容?在Linux上,您可以分叉一个进程,然后稍后再收集它,如帮助页面?parallel::mccollect()中所示;这更像是一种黑客行为,而不是像future这样的强大功能 > p <- mc
(def x
在新线程中执行一些昂贵的计算
repl未被阻止,因此您可以继续执行其他操作
(未来
(做
(线程/睡眠500)
3.14)))
;; ... 做点别的
;; 现在当你需要x的时候
;; 只需预测未来,获得3.14
@x
在R中是否有类似的内容?在Linux上,您可以分叉一个进程,然后稍后再收集它,如帮助页面
?parallel::mccollect()
中所示;这更像是一种黑客行为,而不是像future这样的强大功能
> p <- mcparallel({ Sys.sleep(5); "done" })
> sqrt(1:5)
[1] 1.000000 1.414214 1.732051 2.000000 2.236068
> mccollect(p)
$`15666`
[1] "done"
如果这3个作业都没有完成,则
res
为空。我不知道有一种简单的方法可以在R中执行多个线程。这里的一些讨论:。不过,我很好奇是否有一个好的解决方案。从什么意义上说,这并不稳健?@qed也许我太愤世嫉俗了。例如,mcparallel/mccollect不是跨平台的,而且似乎会出现各种各样的问题,例如,对我来说,mcparallel(quit())似乎会中断R的连接,因此帮助如?mcparallel
抱怨无法打开连接(!?),等等。我明白了,这一点也不愤世嫉俗,公平点。Akward在R中对concurreny/parallelism的支持是我逐渐将工作流程切换到clojure的原因之一,clojure是一种很棒的语言。
require(parallel)
p1 = mcparallel({Sys.sleep(90); list(tag = "job1", res = 1})
p2 = mcparallel({Sys.sleep(80); 2})
p3 = mcparallel({Sys.sleep(60); 3})
res = mccollect(list(p1, p2, p3), wait = FALSE)
is.null(res)