我想用R做一些多线程。我已经习惯了C pthread功能。我想做的是:
#initialisation
n=10
A <- numeric(n)
i=c(1:n/2)
# compute some indexes using the one function fun1
# equivalent in C with correct initialisation of t1 and attr:
## pthread_create(&t1, &attr, fun1, i)
A[i] <- fun1(length(i))
# compute other indexes using another function fun2
# equivalent in C with correct initialisation of t2 and attr:
## pthread_create(&t2, &attr, fun2, i)
A[-i] <- fun2(n-length(i))
# wait for the thread to finish
# equivalment in C:
## pthread_join(t1); pthread_join(t2)
# do something with the result
A
fun1和fun2这两个函数是完全独立的我不认为使用fork()
是合适的,因为我想在完成下一步之前等待所有线程完成。结果包含2个函数fun1
和fun2
。
答案 0 :(得分:0)
你是否遍历i
?如果是,那么您是否也可以依次评估每个fun1
的{{1}}和fun2
?在这种情况下,使用i
包和i
之类的并行后端在foreach
上构建一个循环。像
doMC
否则,构建一个伪功能,您将通过切换,告诉它require(foreach)
require(doMC)
A <- foreach( i = 1:(n/2), .combine=rbind) %dopar% {c(fun1(i),fun2(i))}
fun1
运行哪个
fun2
还构建一个带有对于fun1和fun2的arguemnts的列表。并将其放入switchingFun <- function( .., selFun=1){
if(selFun == 1){ fun1( ...)} else {fun2(... )
}
循环中。 (foreach( selFun in 1:2) %dopar% {switchingFun( arguments[[selFun]], selFun)}
非常有用,我只是尝试过了!)
您将/可能/应该看看您调用的函数,您可能需要在传递它之前对参数列表执行某些操作(获取正确的类型,解开它...)...
函数
switchingFun
(可能)不会按照您想要的方式运作。在R中,A[-i]
选择A[-i]
所有 索引的元素...