Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个新线程中进行计算,并在后面的R中参考结果_R_Concurrency_Clojure - Fatal编程技术网

在一个新线程中进行计算,并在后面的R中参考结果

在一个新线程中进行计算,并在后面的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

在clojure中,我可以这样做:

(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)