gpt4 book ai didi

python - 多处理和 rpy2(使用 ape)

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:35 25 4
gpt4 key购买 nike

我今天遇到了这个,想不通为什么。我有几个链接在一起的函数,它们作为更大管道的一部分执行一些耗时的操作。我已将这些包含在此处,并尽可能简化为一个测试示例。问题是当我直接调用一个函数时,我得到了预期的输出(例如,5 棵不同的树)。但是,当我使用 apply_async(或应用,无关紧要)在多处理池中调用相同的函数时,我得到了 5 棵树,但它们都是一样的。

我已经在 IPython 笔记本中对此进行了记录,可以在这里查看:http://nbviewer.ipython.org/gist/cfriedline/0e275d528ff1a8d674c6

在单元格 91 中,我创建了 5 棵树(每棵树有 10 个提示),并返回两个列表。第一个包含非多处理树,第二个来自 apply_async。

在单元格 92 中,您可以看到在没有多处理的情况下创建树的结果,而在 93 中,有多处理的情况。

我预计两个测试之间总共会有 10 棵不同的树,但所有的多处理树都是相同的。对我来说没什么意义。

事物的相关版本:

  • Linux 2.6.18-238.12.1.el5 x86_64 GNU/Linux
  • Python 2.7.6::Anaconda 1.9.2(64 位)
  • IPython 2.0.0
  • Rpy2 2.3.9

谢谢!克里斯

最佳答案

我解决了这个问题,@mgilson 指出了正确的方向。事实上,这是一个随机数问题,只是不是在 python 中——在 R 中(叹息)。 R 的状态在创建 Pool 时被复制,这意味着它的随机种子也是如此。要修复,只需如下调用 R 的 set.seed 函数的一点 rpy2(带有一些特定于过程的东西以备不时之需):

def create_tree(num_tips, type):
"""
creates the taxa tree in R
@param num_tips: number of taxa to create
@param type: type for naming (e.g., 'taxa')
@return: a dendropy Tree
@rtype: dendropy.Tree
"""
r = rpy2.robjects.r
set_seed = r('set.seed')
set_seed(int((time.time()+os.getpid()*1000)))
rpy2.robjects.globalenv['numtips'] = num_tips
rpy2.robjects.globalenv['treetype'] = type
name = _get_random_string(20)
if type == "T":
r("%s = rtree(numtips, rooted=T, tip.label=paste(treetype, seq(1:(numtips)), sep=''))" % name)
else:
r("%s = rtree(numtips, rooted=F, tip.label=paste(treetype, seq(1:(numtips)), sep=''))" % name)
tree = r[name]
return ape_to_dendropy(tree)

关于python - 多处理和 rpy2(使用 ape),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24029634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com