В моем скрипте python я вызываю функцию много раз с различными входными параметрами. Для этого я использовал многопоточность с pool.apply_async
и назову это много раз внутри for. Тем не менее, я хочу проверить, сколько выходных файлов было создано в качестве индикатора прогресса. Кажется, что, как только процессы запущены, я не могу запускать эту внешнюю функцию в любое время.Как я могу прерывать многопоточный пул для вызова короткой функции
Как я могу прервать и спросить: «Привет, давайте проверим количество файлов с FileCount()
Вот мой код:?.
def FileCount(path):
Path = os.getenv("HOME") + "/hbar_gshfs/" + path
list_dir = []
list_dir = os.listdir(Path)
count = 0
for file in list_dir:
if file.endswith('.root'):
count += 1
return count
main()
if args.run:
mkdir_p(args.outdir)
pool=Pool(10)
for n in reversed(qnumbers):
for pos in positions:
for temp in temperatures:
for fmap in BFieldmap:
for fseek in fieldSeek:
for lH, uH in zip(lowerHysteresis,upperHysteresis):
if BFieldmap.index(fmap) !=positions.index(pos):
continue
pool.apply_async(g4Run,args=(paramToOutputName(args.macrodir,temp, n, pos, fmap, fseek, lH, uH),))
pool.close();
pool.join();
Я говорю спасибо за каждый вход на что
Благодарим за помощь. Но, к сожалению, код вообще не работает g4Run. Но я - тихий новичок в Python. – HiggsBoson
Извините, теперь он работает отлично, точно так же, как вы предлагали в коде. Хорошая вещь в моей симуляции заключается в том, что файлы создаются после завершения данных, поэтому это очень хороший прогресс. Но я не уверен, полностью ли понимаю ваш код. Я считаю, что map_async (...) автоматически перебирает генератор и запускает потоки с этими итерационными аргументами. Но что именно происходит async_result.wait(). Ожидает ли он 1 секунду без блокировки какого-либо процесса? А async_result.ready() является False до тех пор, пока последний поток не будет завершен? Еще раз спасибо. Best, – HiggsBoson
@HiggsBoson 'pool' содержит несколько потоков (или они обрабатываются? Я считаю, что Python не предоставляет' threading.Pool', только 'multiprocessing.Pool') уже создан. Да, «map_async» принимает значение из итеративного (в этом случае генератора) выполняет функцию с этим значением в свободном процессе из «пула». Когда какой-то процесс в пуле завершает обработку своего значения, 'map_async' берет другое значение из итерабельного и отправляет ему и так далее, пока в iterable больше нет значений. – Kolmar