Python多处理 - 返回一个字典

时间:2016-08-25 09:16:28

标签: python dictionary multiprocessing

我希望并行化一个函数,该函数返回一个平坦的值列表(称为" keys"),但我不知道如何在最终结果中获取。我试过了:

def toParallel(ht, token):
    keys = []
    words = token[token['hashtag'] == ht]['word']
    for w in words:
        keys.append(checkString(w))
    y = {ht:keys}

num_cores = multiprocessing.cpu_count()
pool = multiprocessing.Pool(num_cores)

token = pd.read_csv('/path', sep=",", header = None, encoding='utf-8')
token.columns = ['word', 'hashtag', 'count']
hashtag = pd.DataFrame(token.groupby(by='hashtag', as_index=False).count()['hashtag'])

result = pd.DataFrame(index = hashtag['hashtag'], columns = range(0, 21))
result = result.fillna(0)

final_result = []
final_result = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']]

其中toParallel函数应返回带有hashtag作为键的dict和一个键列表(其中键为int)。但如果我尝试打印final_result,我只获得

  

多处理.pool.ApplyResult对象的绑定方法ApplyResult.get位于0x10c4fa950

我该怎么做?

1 个答案:

答案 0 :(得分:1)

final_result = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']]

您可以使用Pool.apply()并立即获得结果(在这种情况下,您不需要multiprocessing hehe,该函数只是为了完整性)或使用Pool.apply_async()后跟Pool.get()Pool.apply_async() 异步

这样的事情:

workers = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']]
final_result = [worker.get() for worker in workers]

或者,您也可以使用Pool.map()来完成所有这些操作。

无论哪种方式,我建议您仔细阅读the documentation

附录:在回答这个问题时,我认为OP正在使用Linux或OSX等Unix操作系统。如果您使用的是Windows,则不要忘记使用if __name__ == '__main__'来保护您的父/工作进程。这是因为Windows缺少fork(),所以子进程从文件的开头开始,而不是像在Unix中那样分叉,所以你必须使用if条件来指导它。请参阅here

ps:这是不必要的:

num_cores = multiprocessing.cpu_count()
pool = multiprocessing.Pool(num_cores)

如果你在没有参数(或multiprocessing.Pool())的情况下调用None,它已经创建了一个具有cpu数量大小的工作池。