簡體   English   中英

Mulitprocessing和rpy2(帶猿)

[英]Mulitprocessing and rpy2 (with ape)

我今天碰到了這個,不知道為什么。 我將多個函數鏈接在一起,這些函數作為大型管道的一部分執行一些耗時的操作。 我將這些包括在內,並盡可能精簡為一個測試示例。 問題是,當我直接調用函數時,會得到預期的輸出(例如5棵不同的樹)。 但是,當我在多處理池中使用apply_async調用相同的函數時(或Apply無關緊要),我得到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

謝謝! 克里斯

我不是100%熟悉這些庫,但是,在Linux上(IIRC) multiprocessing使用os.fork 這意味着隨機模塊(您正在使用)的狀態也將被分叉,並且每個進程將生成相同的隨機數序列,從而導致_get_random_string函數不太隨機。

如果我是對的,並且您使池小於所需的樹數,則應該看到您得到了由N個相同的樹組成的組(其中N是池的數目)。

我認為,可能的理想解決方案是在每個進程內部重新植入隨機數生成器。 它們不太可能完全同時運行,因此您應該得到不同的結果。

我通過@mgilson正確的方向解決了這一問題。 實際上,這是一個隨機數問題,只是不是在python中-在R(嘆氣)中。 創建池時,將復制R的狀態,這意味着其隨機種子也將被復制。 為了解決這個問題,只需調用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM