5 python dictionary multiprocessing
我想并行化一个在字典中返回扁平值列表(称为“键”)的函数,但我不明白如何获得最终结果。我努力了:
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']]
Run Code Online (Sandbox Code Playgroud)
其中 toParallel 函数应返回一个以主题标签为键的字典和一个键列表(其中键为 int)。但是如果我尝试打印 Final_result,我只能得到
multiprocessing.pool.ApplyResult 对象的绑定方法ApplyResult.get位于0x10c4fa950
我该怎么做?
final_result = [pool.apply_async(toParallel, args=(ht,token,)) for ht in hashtag['hashtag']]
Run Code Online (Sandbox Code Playgroud)
您可以立即使用Pool.apply()并获取结果(在这种情况下您不需要multiprocessing呵呵,该函数只是为了完整性)或使用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]
Run Code Online (Sandbox Code Playgroud)
或者,您也可以使用Pool.map()which 来为您完成这一切。
无论哪种方式,我建议您仔细阅读文档。
附录:在回答这个问题时,我假设OP正在使用一些Unix操作系统,如Linux或OSX。如果您使用的是 Windows,您一定不要忘记使用if __name__ == '__main__'. 这是因为 Windows 缺乏fork(),因此子进程从文件的开头开始,而不是像 Unix 那样从分叉点开始,因此必须使用条件if来引导它。看这里。
ps:这是不必要的:
num_cores = multiprocessing.cpu_count()
pool = multiprocessing.Pool(num_cores)
Run Code Online (Sandbox Code Playgroud)
如果您multiprocessing.Pool()不带参数调用(或None),它已经创建了一个与您的 cpu 计数大小相同的工作池。
| 归档时间: |
|
| 查看次数: |
8058 次 |
| 最近记录: |