【问题标题】:Mulitprocessing and rpy2 (with ape)多处理和 rpy2(带猿)
【发布时间】:2014-06-04 05:23:50
【问题描述】:

我今天遇到了这个问题,不知道为什么。我有几个函数链接在一起,作为更大管道的一部分执行一些耗时的操作。我已经将这些包括在这里,尽可能地简化为一个测试示例。问题是当我直接调用一个函数时,我得到了预期的输出(例如,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

谢谢! 克里斯

【问题讨论】:

    标签: python r multiprocessing rpy2 ape-phylo


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      我不是 100% 熟悉这些库,但是,在 Linux 上,(IIRC) multiprocessing 使用 os.fork。这意味着随机模块(您正在使用)的状态也将被分叉,并且您的每个进程都将生成 相同的随机数序列,从而导致不那么随机的 @ 987654327@函数。

      如果我是对的,并且您使池小于您想要的树的数量,您应该会看到您得到 N 组相同的树(其中 N 是池的数量)。

      我认为理想的解决方案可能是re-seed 每个进程内部的随机数生成器。它们不太可能完全同时运行,因此您应该得到不同的结果。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 2012-10-08
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多