我这里有一个奇怪的问题。
我有一个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))
答案 0 :(得分:2)
这里有几个问题 - 我猜你以前从未使用过multiprocessing
。
您的一个问题是您启动异步操作但从不等待它结束。如果您 等待它结束,您将获得更多信息。例如,添加:
result = SeqFile.run.get()
执行此操作,您将看到子进程中引发的异常:您将execfile
映射到绑定到file
的字符串,因此{{1一次看到一个字符。 execfile
barfs当它尝试做的第一件事是(实际上):
execfile
execfile("/")
会更有意义,或apply_async()
传递了您要运行的所有文件的列表。
等等 - 这很乏味; - )
让我们摆脱这里无关紧要的瑕疵,并展示一个完整的可执行程序。我有三个文件map_async()
,a.py
和b.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()
更明确?尽量保持简单。