2012-04-27 73 views
3

我在使用平行版本的地圖時遇到了一些麻煩(ppmap包裝,由Kirk Strauser實施)。ppmap/parallel python中是否存在隱藏的可能死鎖?

我試圖並行運行的函數對大量字符串(蛋白質序列)進行簡單的正則表達式搜索,這些字符串使用BioPython的SeqIO從文件系統中解析出來。每個函數調用都使用它們自己的文件。

如果我使用法線貼圖運行函數,一切都按預期工作。但是,使用ppmap時,一些運行簡單凍結,沒有CPU使用率,主程序甚至不會對KeyboardInterrupt作出反應。另外,當我觀察正在運行的進程時,工作人員仍然在那裏(但不再使用任何CPU)。

例如

/usr/bin/python -u /usr/local/lib/python2.7/dist-packages/pp-1.6.1-py2.7.egg/ppworker.py 2>/dev/null 

此外,工人似乎沒有凍結任何特定的數據錄入 - 如果我手動終止該進程,然後重新運行的執行,停止在不同的點。 (所以我暫時保留了一個已完成的條目列表並多次重新啓動程序)。

有什麼方法可以看到問題出在哪裏?代碼

樣品,我運行:

def analyse_repeats(data): 
    """ 
    Loads whole proteome in memory and then looks for repeats in sequences, 
    flags both real repeats and sequences not containing particular aminoacid 
    """  
    (organism, organism_id, filename) = data 

    import re 
    letters = ['C','M','F','I','L','V','W','Y','A','G','T','S','Q','N','E','D','H','R','K','P'] 

    try: 
     handle = open(filename) 
     data = Bio.SeqIO.parse(handle, "fasta") 

     records = [record for record in data] 
     store_records = [] 
     for record in records: 
      sequence = str(record.seq) 
      uniprot_id = str(record.name) 
      for letter in letters: 
       items = set(re.compile("(%s+)" % tuple(([letter] * 1))).findall(sequence))  
       if items: 
        for item in items: 
         store_records.append((organism_id,len(item), uniprot_id, letter)) 
       else: 
        # letter not present in the string, "zero" repeat 
        store_records.append((organism_id,0, uniprot_id, letter)) 
     handle.close() 
     return (organism,store_records) 
    except IOError as e: 
     print e 
     return (organism, []) 


res_generator = ppmap.ppmap(
    None, 
    analyse_repeats, 
    zip(todo_list, organism_ids, filenames) 
) 

for res in res_generator: 
    # process the output 

如果我用簡單的地圖,而不是ppmap的,一切工作正常:

res_generator = map(
    analyse_repeats, 
    zip(todo_list, organism_ids, filenames) 
) 
+0

在死鎖消失之前,您能從代碼示例中拿出多少? – 2012-04-27 15:51:17

+0

好主意 - 會嘗試回報。 – petr 2012-04-29 13:06:43

回答

0

你可以嘗試使用的方法之一(而不是multiprocessing模塊的Pool對象中的對象map)。其優點是它內置並且不需要外部封裝。它也工作得很好。

默認情況下,它使用盡可能多的工作進程,因爲您的計算機具有核心,但您也可以指定更高的數字。

+0

這似乎是工作更好一點,謝謝! – petr 2012-05-08 10:40:45

0

我可以建議使用dispy(http://dispy.sourceforge.net)嗎?免責聲明:我是作者。我明白它不直接解決問題,但希望能幫助你。

+0

將研究它 - 並可能將其用於下一個項目。 – petr 2012-05-08 10:41:37

相關問題