2016-11-15 4 views
0

я реализовал синтаксический анализатор так,Python multiprocessing.pool не удалось остановить после завершения всех задач

import multiprocessing 
import time 

def foo(i): 
    try: 
     # some codes 
    except Exception, e: 
     print e 

def worker(i): 
    foo(i) 
    time.sleep(i) 
    return i 


if __name__ == "__main__": 
    pool = multiprocessing.Pool(processes=4) 
    result = pool.map_async(worker, range(15)) 
    while not result.ready(): 
     print("num left: {}".format(result._number_left)) 
     time.sleep(1) 
    real_result = result.get() 
    pool.close() 
    pool.join() 

Мой анализатор фактически завершает все процессы, но результаты не доступны т.е., это все еще внутри время петля и печать num left : 2. Как я это прекратил? И я не хочу значения переменной real_result.

Я бегу Ubuntu 14.04, питона 2,7

соответствующая часть моего кода выглядит,

async_args = ((date, kw_dict) for date in dates) 
    pool = Pool(processes=4) 
    no_rec = [] 

    def check_for_exit(msg): 
     print msg 
     if last_date in msg: 
      print 'Terminating the pool' 
      pool.terminate() 
    try: 
     result = pool.map_async(parse_date_range, async_args) 
     while not result.ready(): 
      print("num left: {}".format(result._number_left)) 
      sleep(1) 

     real_result = result.get(5) 

     passed_dates = [] 

     for x, y in real_result: 
      passed_dates.append(x) 
      if y: 
       no_rec.append(y[0]) 

     # if last_date in passed_dates: 
     #  print 'Terminating the pool' 
     #  pool.terminate() 

     pool.close() 
    except: 

     print 'Pool error' 
     pool.terminate() 
     print traceback.format_exc() 
    finally: 
     pool.join() 
+2

Какая версия Python на какой ОС? Работала отлично 5 раз подряд для меня, под Python 3.5.2 на 64-битной Win 10. –

+0

@TimPeters работает для небольшого объема данных, но при обработке на больших наборах данных result.ready() не вернет true после обработки всех данных .. т. е. он stiill печатает numleft 3: он остается в течение 15 минут, тогда он печатает numleft 2 .. –

+0

это из-за того, что какой-то рабочий процесс все еще ожидает вывода? Рабочий func содержит код, который также отвечает за исключение throwing, но я правильно использовал исключающий класс для исключения исключений, которые были обнаружены внутри этой конкретной функции. –

ответ

0

Моя ставка является то, что у вас есть неисправный parse_date_range, который вызывает рабочий процесс прекратить без производя любое исключение или исключение. Вероятно, exit libc вызывается модулем C/lib из-за очень неприятной ошибки.
Этого код воспроизводит бесконечный цикл вы наблюдать:

import sys 
import multiprocessing 
import time 

def parse_date_range(i): 
    if i == 5: 
     sys.exit(1) # or raise SystemExit; 
        # other exceptions are handled by the pool 
    time.sleep(i/19.) 
    return i 


if __name__ == "__main__": 
    pool = multiprocessing.Pool(4) 
    result = pool.map_async(parse_date_range, range(15)) 
    while not result.ready(): 
     print("num left: {}".format(result._number_left)) 
     time.sleep(1) 
    real_result = result.get() 
    pool.close() 
    pool.join() 

Надеется, что это поможет.

+0

см. Http://stackoverflow.com/questions/40617545/python-multiprocessing-pool-failed-to-stop-after-finishing-all-the-tasks#comment68611587_40617545 –

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