1

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

我有一个 python 程序,它执行保存在单独的 .py 文件中的代码,设计为一个接一个地按顺序执行。代码运行良好,但运行时间过长。我的计划是使用 execfile() 作为函数,文件名作为参数,使用 multiprocessing.pool.map_async(function, arguments) 在 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))
4

1 回答 1

2

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

您的问题之一是您触发了异步操作,但从不等待它结束。如果您确实等待它结束,您将获得更多信息。例如,添加:

result = SeqFile.run.get()

这样做,您将看到子进程中引发的异常:您正在映射绑定到execfile字符串file,因此一次只能execfile看到一个字符。 execfilebarfs 当它尝试做的第一件事是(实际上):

execfile("/")

apply_async()会更有意义,或者map_async()传递您要运行的所有文件的列表。

等等 - 这变得乏味;-)

细节

让我们摆脱这里无关紧要的东西,并展示一个完整的可执行程序。我有三个文件a.pyb.pyc.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!

imap_unordered()在工作进程之间拆分文件列表,并且不关心(“无序”)它们运行的​​顺序。这是最有效的。请注意,我将工作人员的数量限制为 2,只是为了表明即使文件 (3) 比工作进程 (2) 多,它也能正常工作。

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

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

或者:

asyncs = [pool.apply_async(execfile, (fn,)) for fn in files]
for a in asyncs:
    a.get()

更清晰?一开始尽量简单。

于 2013-10-27T03:41:59.447 回答