Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Non-Responsive multiprocessing.pool.map\u async()函数_Python_Object_Multiprocessing - Fatal编程技术网

Python:Non-Responsive multiprocessing.pool.map\u async()函数

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)中运

我这里有个奇怪的问题

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