Python:Non-Responsive multiprocessing.pool.map\u async()函数
我这里有个奇怪的问题 我有一个python程序,它执行保存在单独的.py文件中的代码,设计为按顺序一个接一个地执行。代码工作正常,但运行时间太长。我的计划是使用multiprocessing.pool.map\u async(函数,参数),使用execfile()作为函数,使用filename作为参数,在4个处理器之间分割处理这些.py文件 所以不管怎样,当我运行代码时,完全没有发生任何事情,甚至没有错误 看一看,看看你是否能帮我,我在SeqFile.runner(SeqFile.file)中运行这个文件Python:Non-Responsive multiprocessing.pool.map\u async()函数,python,object,multiprocessing,Python,Object,Multiprocessing,我这里有个奇怪的问题 我有一个python程序,它执行保存在单独的.py文件中的代码,设计为按顺序一个接一个地执行。代码工作正常,但运行时间太长。我的计划是使用multiprocessing.pool.map\u async(函数,参数),使用execfile()作为函数,使用filename作为参数,在4个处理器之间分割处理这些.py文件 所以不管怎样,当我运行代码时,完全没有发生任何事情,甚至没有错误 看一看,看看你是否能帮我,我在SeqFile.runner(SeqFile.file)中运
您在这里遇到了几个问题-我猜您以前从未使用过
多处理
您的问题之一是启动异步操作,但从不等待它结束。如果你等它结束,你会得到更多的信息。例如,添加:
result = SeqFile.run.get()
这样做,您将看到子进程中引发的异常:您将execfile
映射到绑定到file
的字符串上,因此execfile
一次只能看到一个字符execfile
在它尝试做的第一件事是(实际上)时会呕吐:
apply\u 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()
仅此而已,打印(一些排列):
imap_unordered()
将文件列表在工作进程之间拆分,而不关心(“unordered”)文件的运行顺序。这是最有效的。请注意,我将工作进程的数量限制为2,只是为了表明即使文件(3)比工作进程(2)多,它也可以正常工作
您可以让任何池
函数以类似方式工作。如果有;-)例如,要使用map\u async()
,请将imap\u unordered()
调用替换为:
async = pool.map_async(execfile, files)
async.get()
或:
更清楚?首先尽量简单。所以我使用了apply_async,并在(SeqFile.runner(SeqFile.file)),result=SeqFile.run.get(timeout=None)之后添加了这一行。我现在得到这个错误TypeError:execfile()最多接受3个参数(给出了81个参数)。据我所知,这意味着它将每个字符作为参数(假设我使用的字符串中有81个字符)。当我回到使用map_async时,我得到了您提到的错误--IOError:[Errno 21]是一个目录:'/'--因为它将第一个字符作为参数。有什么简单的方法可以绕过这个问题吗?execfile()通常用于字符串。请尝试。应用异步(execfile,args=(file,)
。所有这些函数都需要一个iterable生成参数。如果你直接传递一个字符串,那就是一个iterable,一次产生一个字符。预期的方式是我刚才展示的,传递参数的元组(在本例中,是一个包含单个值的元组)。但最好还是使用map\u async()
传递所有文件路径的元组。将每个文件路径放在自己的类实例中只会使您的生活变得复杂;-)好的,这对我来说现在好多了。出于好奇,多处理就是这样使用的吗?我看到人们也只是将其用于单个函数,而不是整个代码。@user2631970,mp
是指在多个进程都是好方法时使用;-)我见过的大多数用法都涉及主程序和工作人员之间的一些通信,比如生产者/消费者问题,几个工作人员从mp.Queue
中获取工作描述,并通过另一个队列将结果传回主程序。对于您的特定示例,我想大多数人会使用子流程
模块,显式调用(一些拼写)python.exe
。你的应用程序很聪明!:-)
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!
async = pool.map_async(execfile, files)
async.get()
asyncs = [pool.apply_async(execfile, (fn,)) for fn in files]
for a in asyncs:
a.get()