我在使用map的并行版本时遇到了一些问题(ppmapwrapper,由Kirk Strauser实现)。
我试图并行运行的函数在大量字符串(蛋白质序列)上运行一个简单的正则表达式搜索,这些字符串使用BioPython的SeqIO从文件系统中解析。每个函数调用都使用自己的文件。
如果我使用一个普通的映射运行这个函数,一切都会按预期工作。然而,当使用ppmap时,有些运行简单冻结,没有CPU使用,主程序甚至对键盘中断没有反应。另外,当我查看正在运行的进程时,工人仍然在那里(但不再使用任何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

如果我使用simple map而不是ppmap,一切正常:
res_generator = map(
    analyse_repeats,
    zip(todo_list, organism_ids, filenames)
)

最佳答案

您可以尝试使用map模块中Pool对象的方法之一(如multiprocessing)。优点是它是内置的,不需要外部包。它也工作得很好。
默认情况下,它使用的工作进程数量与计算机的核心数量相同,但您也可以指定一个更高的数字。

关于python - ppmap/parallel python中是否存在潜在的死锁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10352606/

10-12 18:57