2016-08-25 2 views
1

Я хотел бы распараллелить функцию, которая возвращает сглаживающий список значений (называемых «ключами») в dict, но я не понимаю, как получить в конечном результате. Я пробовал:Многопроцессорность Python - Return a dict

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 должна возвращать Dict с хэштегом как ключ и список ключей (где ключи INT). Но если я пытаюсь напечатать final_result, я получаю только

связанный метод ApplyResult.get объекта multiprocessing.pool.ApplyResult на 0x10c4fa950

Как я могу это сделать?

ответ

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

Вы можете использовать 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] 

В качестве альтернативы, вы можете также использовать Pool.map(), который будет делать все это для вас.

В любом случае, я рекомендую внимательно прочитать the documentation.


Добавление: При ответе на этот вопрос, я предполагал OP использует некоторые Unix операционной системы, как Linux или OSX. Если вы используете Windows, вы не должны забывать защищать свои родительские/рабочие процессы, используя if __name__ == '__main__'. Это связано с тем, что Windows не хватает fork(), поэтому дочерний процесс начинается в начале файла, а не в точке разветвления, как в Unix, поэтому вы должны использовать условие if для его руководства. См. here.


пс: это лишнее:

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

Если вы звоните multiprocessing.Pool() без аргументов (или None), это уже создает пул рабочих с размером вашего счетчика центрального процессора.

Смежные вопросы