我在使用平行版本的地圖時遇到了一些麻煩(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)
)
在死鎖消失之前,您能從代碼示例中拿出多少? – 2012-04-27 15:51:17
好主意 - 會嘗試回報。 – petr 2012-04-29 13:06:43