繁体   English   中英

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

[英]Python: Non-Responsive multiprocessing.pool.map_async() function

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

我有一个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))

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

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

result = SeqFile.run.get()

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

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()

更清晰? 首先,使其尽可能简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM