У меня есть скрипт, который создает файлы из большого набора данных, поэтому я использую многопроцессорную обработку для ускорения работы. У меня проблема в том, что мой сценарий принимает несколько аргументов командной строки с использованием библиотеки argparse
, которые изменяют результаты, и я пытаюсь передать аргументы командной строки в функцию, вызываемую моим многопроцессорным пулом.
I Я уверен, что решение этого действительно просто, я просто не вижу его. Я подумал, что сделаю глобальную переменную, которая будет обновлена, чтобы отражать аргументы командной строки, но моя функция, вызываемая пулом, все еще имеет старое значение. Я попытался проиллюстрировать мою проблему ниже:
output_dir = 'default'
def do_task(item):
print(output_dir) # Prints 'default'
result = process_item(item)
write_to_file(data=result, location=os.path.join(output_dir, item.name))
def do_multi_threaded_work(data_path):
print(output_dir) # Prints command line argument
data = read_from_file(args.input_file)
pool = multiprocessing.Pool()
for i, _ in enumerate(pool.imap_unordered(do_task, data):
print('Completed task %d/%d' % (i, len(data)))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output-dir')
parser.add_argument('-i', '--input-file')
args = parser.parse_args()
output_dir = args.output_dir
do_multithreaded_work(args.input_file)
Как я могу гарантировать, что я сохраняю свои файлы в правильном каталоге в соответствии с аргументами командной строки?
Редактировать : Было предложено, чтобы я сделал что-то вроде приведенного ниже кода, однако, учитывая, что у меня довольно много констант (в этом примере я упростил до 1), это выглядит очень грязно и нелогично. Неужели нет лучшего способа просто установить глобальную константу, доступную для функции do_task
, без жесткого кодирования значения?
from itertools import repeat
...
def do_multi_threaded_work(data_path):
...
for i, _ in enumerate(pool.imap_unordered(do_task, zip(data, repeat(output_dir))):