2017-10-20 77 views
0

因此,我正在开发一个应用程序,每次启动时都要检查〜50 GB的数据与哈希列表。显然这需要并行化,我不希望应用程序挂在“LOADING ...”屏幕上一分半钟。multiprocessing.Pool.map_async似乎并没有做任何事情吗?

我正在使用multiprocessing.Poolmap_async来处理这个;主线程调用map_async(checkfiles, path_hash_pairs, callback)并提供一个回调,告诉它在发现不匹配时发出警告。

麻烦是......没有任何反应。用我的任务管理器查看Python进程显示它们产生并立即终止而不做任何工作。他们从不打印任何东西,当然也不会打完电话。

该缩小的例子也表现出了同样的问题:

def printme(x): 
    time.sleep(1) 
    print(x) 
    return x**2 

if __name__ == "__main__": 
    l = list(range(0,512)) 

    def print_result(res): 
     print(res) 

    with multiprocessing.Pool() as p: 
     p.map_async(printme, l, callback=print_result) 
    p.join() 
    time.sleep(10) 

运行它,...没有任何反应。交换map_asyncmap完全按预期工作。

我只是犯了一个愚蠢的错误或什么?

+0

你是如何将上下文管理器应用到池的?这是我不知道的新东西吗?如果我运行你的代码,我会得到:'AttributeError:__exit__',但是如果我手动管理池(map_async,关闭),一切正常。 –

回答

2

让我们看看会发生:

您正在使用一个上下文管理器自动“关闭” Pool,但是,什么是重要的,如果你检查Pool.__exit__的源代码,你会发现:

def __exit__(self, exc_type, exc_val, exc_tb): 
    self.terminate() 

它只是拨打terminate而不是close。所以你仍然需要明确关闭Pool然后join它。

with multiprocessing.Pool() as p: 
    p.map_async(printme, l, callback=print_result) 
    p.close() 
    p.join() 

但在这种情况下,使用上下文管理器是没有意义的,只是使用普通的形式:

p = multiprocessing.Pool() 
p.map_async(printme, l, callback=print_result) 
p.close() 
p.join() 

,为什么它有map的作品?因为map将阻止util所有作品完成。

相关问题