能够在R中创建一个函数,该函数可能会阻塞,直到定义了资源或为其指定了适当的值,这对我来说非常有用。我知道R是单线程的,但是我希望mc能够提供帮助。然而,

library(parallel)
f = function() {
  while(!exists('a')) Sys.sleep(1);
  print('success!')
}
d = mcparallel(f())
a = 1
mccollect(d)

无限期地挂起。有什么有效的解决方法,还是我必须研究根本不同的模式/不同的语言才能实现某种目的?

最佳答案

我什至不知道有可能 fork 这样的过程。玩了一会儿之后,我发现了sendChildStdin函数,您应该检查一下。这是发信号子进程的至少一种方式。这是一个例子:

f<- function () {
  message<-scan(n = 1, quiet = TRUE, what='character')
  return(message)
}
p  <- mcparallel(f())
a <- 1
# The message shouldn't contain spaces and should end with a newline.
parallel:::sendChildStdin(p, "created\n")
mccollect(p)[[1]]
[1] "created"

不要误会我的意思;如果您将大量使用R语言,R可能不是您想要的语言,但是它可能适用于轻量级应用程序。

我之前曾在RStudio中测试过代码,尽管它似乎可以正常工作,但是它以无法与成功区分开的方式失败。无论如何,它基本上不等待scan进程。例如,它永远都不会完成,但确实会完成(仅在RStudio中)
f<- function () {
  message<-scan(n = 1, quiet = TRUE, what='character')
  return(message)
}
p  <- mcparallel(f())
# parallel:::sendChildStdin(p, "created\n")
mccollect(p)[[1]]
# character(0)

关于r - 在R中阻塞并等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14720281/

10-12 17:41