2015-01-20 2 views
1

В моем скрипте 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(); 

Я говорю спасибо за каждый вход на что

ответ

0

Почему нет? Функция FileCount возвращает количество файлов , созданных, но не полностью законченных и заполненных данными (при условии, что g4Run создает один файл e в начале, а затем продолжает заполнять его данными). Но этого должно быть достаточно для простого индикатора прогресса.

В противном случае вы можете использовать multiprocessing.Value. Передайте его каждому g4Run в качестве дополнительного аргумента и добавьте g4Run, чтобы увеличить его на один после того, как он закончил выполнение своей работы.

Чтобы позвонить по телефону FileCount через определенные интервалы времени, вы можете позвонить по телефону Pool.map_async. Для этого преобразуйте свой цикл в генератор:

def generate_params(): 
    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 

          yield paramToOutputName(args.macrodir,temp, n, pos, fmap, fseek, lH, uH) 

async_result = pool.map_async(g4Run, generate_params()) 

pool.close() 
while not async_result.ready(): 
    async_result.wait(1) # Wait 1 second 
    # Call FileCount here and output progress 
pool.join() 
+0

Благодарим за помощь. Но, к сожалению, код вообще не работает g4Run. Но я - тихий новичок в Python. – HiggsBoson

+0

Извините, теперь он работает отлично, точно так же, как вы предлагали в коде. Хорошая вещь в моей симуляции заключается в том, что файлы создаются после завершения данных, поэтому это очень хороший прогресс. Но я не уверен, полностью ли понимаю ваш код. Я считаю, что map_async (...) автоматически перебирает генератор и запускает потоки с этими итерационными аргументами. Но что именно происходит async_result.wait(). Ожидает ли он 1 секунду без блокировки какого-либо процесса? А async_result.ready() является False до тех пор, пока последний поток не будет завершен? Еще раз спасибо. Best, – HiggsBoson

+0

@HiggsBoson 'pool' содержит несколько потоков (или они обрабатываются? Я считаю, что Python не предоставляет' threading.Pool', только 'multiprocessing.Pool') уже создан. Да, «map_async» принимает значение из итеративного (в этом случае генератора) выполняет функцию с этим значением в свободном процессе из «пула». Когда какой-то процесс в пуле завершает обработку своего значения, 'map_async' берет другое значение из итерабельного и отправляет ему и так далее, пока в iterable больше нет значений. – Kolmar

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