Python:非响应式multiprocessing.pool.map_async()函数

时间:2013-10-27 03:09:47

标签: python object multiprocessing

我这里有一个奇怪的问题。

我有一个python程序,它执行以单独的.py文件保存的代码,设计为一个接一个地按顺序执行。代码工作正常,但运行时间太长。我的计划是使用exeprocessfile()作为函数并使用文件名作为参数,使用multiprocessing.pool.map_async(函数,参数)在4个处理器之间分割处理这些.py文件。

所以无论如何,当我运行代码时,绝对没有任何事情发生,甚至不是错误

看看你是否可以帮助我,我在SeqFile.runner(SeqFile.file)中运行该文件。

class FileRunner:
    def __init__(self, file):
        self.file = file
    def runner(self, file):    
        self.run = pool.map_async(execfile, file)

SeqFile = FileRunner("/Users/haysb/Dropbox/Stuart/Sample_proteins/Code/SVS_CodeParts/SequencePickler.py")
VolFile = FileRunner("/Users/haysb/Dropbox/Stuart/Sample_proteins/Code/SVS_CodeParts/VolumePickler.py")
CWFile = FileRunner("/Users/haysb/Dropbox/Stuart/Sample_proteins/Code/SVS_CodeParts/Combine_and_Write.py")
(SeqFile.runner(SeqFile.file))

1 个答案:

答案 0 :(得分:2)

这里有几个问题 - 我猜你以前从未使用过multiprocessing

您的一个问题是您启动异步操作但从不等待它结束。如果您 等待它结束,您将获得更多信息。例如,添加:

result = SeqFile.run.get()

执行此操作,您将看到子进程中引发的异常:您将execfile映射到绑定到file字符串,因此{{1一次看到一个字符。 execfile barfs当它尝试做的第一件事是(实际上):

execfile

execfile("/") 会更有意义,或apply_async()传递了您要运行的所有文件的列表。

等等 - 这很乏味; - )

具体细节

让我们摆脱这里无关紧要的瑕疵,并展示一个完整的可执行程序。我有三个文件map_async()a.pyb.py。这是c.py

a.py

其他两个是明显的变化。

这是我的整个驱动程序:

print "I'm A!"

这就是所需要的,并打印(一些排列):

if __name__ == "__main__":
    import multiprocessing as mp

    files = ["a.py", "b.py", "c.py"]
    pool = mp.Pool(2)
    pool.imap_unordered(execfile, files)
    pool.close()
    pool.join()

I'm A! I'm B! I'm C! 在工作进程之间拆分文件列表,并不关心(“无序”)它们运行的​​顺序。这是最有效的。请注意,我将工作者数量限制为2,只是为了表明它工作正常,即使文件(3)多于工作进程(2)。

您可以让任何imap_unordered()函数以类似方式工作。例如,如果 ;-)使用Pool,请将map_async()来电替换为:

imap_unordered()

或者:

async = pool.map_async(execfile, files)
async.get()

更明确?尽量保持简单。