如何在R中分叉进程

5
我将尝试理解R的多核包实现的分叉系统。该包的示例如下:

我正在尝试理解 R 的 multicore 包实现的 fork 系统。该包的示例如下:

p <- fork()
if (inherits(p, "masterProcess")) {
  cat("I’m a child! ", Sys.getpid(), "\n")
  exit(,"I was a child")
}
cat("I’m the master\n")
unserialize(readChildren(1.5))

但是,当在R交互式控制台中粘贴时,似乎无法正常工作。有没有使用R的多核或并行包来使用fork()的示例?


我认为文档的那部分不应该在控制台中运行。它展示了“熟悉的C语言习惯用法”的语法问题。但是我可能错了。 - Rich Scriven
2
multicore已经被合并到内置包parallel中。 我认为我们应该使用parallel而不是multicore - Randy Lai
你说得对@RandyLai。我花了几分钟搜索并行包,才意识到它现在已经成为基本的 R 包之一。有趣的是,类似的函数 mcfork() 甚至没有被导出;你必须运行 parallel:::mcfork 才能看到它! - Ben Ogorek
我不知道,手动分叉是否真的有必要? - Randy Lai
1个回答

7
在多核包中,“fork”示例“对我有效”;请尝试example(fork)。在非Windows系统上仅支持fork。
我认为在parallel中相应的函数是mcparallel()用于fork和评估表达式,mcollect()用于完成后检索结果。
id = mcparallel({ Sys.sleep(5); TRUE })

返回结果立即可见,但进程仍在运行。

mccollect(id)

5秒后将返回TRUE。除了收集之外,分叉和主进程之间没有其他通信;使用例如套接字实现双向通信将是有趣且不太具有挑战性的。


谢谢您的回复。您说得对:example(fork)确实有效。有什么想法吗?这是个很酷的例子,但是当我运行mccollect(id)时,我得到了一个只有一个空元素的列表。TRUE对您返回了吗? - Ben Ogorek
也许这是mcparallel和mccollect的最简单的示例:p <- mcparallel(5+5); mccollect(p); 您可以使用ps -a在单独的终端中看到进程旋转,并且在运行mccollect后它会变为“defunct”。 - Ben Ogorek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接