Python:无响应多处理.pool.map_异步()功能

2024-09-26 22:49:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个奇怪的问题。在

我有一个python程序,它执行单独的.py文件中保存的代码,设计成按顺序执行,一个接一个地执行。代码运行良好,但运行时间太长。我的计划是使用多处理.pool.map_异步(函数,参数)使用execfile()作为函数,文件名作为参数。在

所以不管怎样,当我运行代码时,绝对不会发生任何事情,甚至没有错误。在

看看你能不能帮我,我把文件放进去序列文件.runner(序列文件.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))

Tags: 文件samplepyselfcodeusersfiledropbox
1条回答
网友
1楼 · 发布于 2024-09-26 22:49:57

你有几个问题-我猜你以前从没用过multiprocessing。在

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

result = SeqFile.run.get()

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

^{pr2}$

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

等等-这很无聊;-)

细节

让我们去掉这里不相关的cruft,并展示一个完整的可执行程序。我有三个文件a.pyb.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()在工作进程之间拆分文件列表,而不关心(“无序”)它们的运行顺序。这样效率最高。请注意,我将worker的数量限制为2,只是为了表明即使文件(3)比worker进程(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()

更清楚?一开始尽量简单。在

相关问题 更多 >

    热门问题