gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:33:38 31 4
gpt4 key购买 nike

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

我有一个 python 程序,它执行保存在单独的 .py 文件中的代码,这些代码被设计为依次执行,一个接一个。这些代码工作正常,但运行时间太长。我的计划是使用 multiprocessing.pool.map_async(function,arguments) 将 execfile() 作为函数,文件名作为参数,在 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))

最佳答案

您在这里遇到了几个问题 - 我猜您以前从未使用过多处理

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

result = SeqFile.run.get()

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

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

更清楚了吗?一开始就尽可能简单。

关于Python:非响应式 multiprocessing.pool.map_async() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19614210/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com