Многопроцессорная обработка Python - apply_async не работает - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь распараллелить код с ThreadPool. Я в настоящее время работаю над окнами. В основном, поведение, которое я получаю, заключается в том, что когда я вызываю apply_async, ничего не происходит. Моя программа просто печатает START и END.

Ниже приведен пример:

import glob
import itertools
import pandas as pd
from multiprocessing.dummy import Pool as ThreadPool 


def ppp(window,day):
    print(window,day)


#%% Reading datasets
print('START')
tree = pd.read_csv('datan\\days.csv')
days = list(tree.columns)
windows = [2000]
processes_args = list(itertools.product(windows, days))


pool = ThreadPool(8) 
results = pool.apply_async(ppp, processes_args)
pool.close() 
pool.join() 
print('END')

Есть много вопросов в стеке, которые предлагают вызывать другие методы, такие как imap_unordered, map, apply. Однако никто из них не решает проблему.

Edit:

results.get()

возвращает ошибку о количестве параметров:

TypeError: ppp() takes 2 positional arguments but 10 were given

Однако в документации говорится, что я могу использовать список кортежей для передачи параметров, в противном случае, как я могу передать их?

Edit2:

processes_args выглядит так, как показано ниже, перед вызовом apply_async:

[(2000, '0808'),
 (2000, '0810'),
 (2000, '0812'),
 (2000, '0813'),
 (2000, '0814'),
 (2000, '0817'),
 (2000, '0818'),
 (2000, '0827'),
 (2000, '0828'),
 (2000, '0829')]

1 Ответ

0 голосов
/ 01 ноября 2018

Позиционные параметры в Pool.apply и Pool.apply_async расширяются с использованием синтаксиса * для распаковки .

Согласно содержанию processed_args ваша функция ppp получит 10 кортежей, если запланировано через apply_async.

Если вы хотите обработать итерацию, я бы порекомендовал вам использовать Pool.map или Pool.map_async. Функции map не расширяют аргументы внутри итерируемого. Вы должны позаботиться об этом сами.

def ppp(element):
    window, day = element
    print(window, day)

pool.map(ppp, processed_args)

Если вы хотите сохранить функцию ppp как есть, вы можете использовать Pool.starmap, которая применяет расширение аргумента к содержимому итератора.

...