Многопроцессорный пул зависает при возникновении исключения в каком-либо потоке - PullRequest
6 голосов
/ 11 февраля 2010

Я новичок в Python и пытаюсь обработать файлы с помощью программы multiprocessing.pool, она работает нормально, если исключений нет. Если какой-либо поток / процесс получает исключение, вся программа ожидает поток

фрагмент кода:

cp = ConfigParser.ConfigParser()
cp.read(gdbini)
for table in cp.sections():
    jobs.append(table)
#print jobs
poolreturn = pool.map(worker, jobs)
pool.close()
pool.join()

Сообщение об ошибке:


Traceback (most recent call last):
  File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 525, in __bootstrap_inner
    self.run()
  File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/opt/cnet-python/default-2.6/lib/python2.6/multiprocessing/pool.py", line 259, in _handle_results
    task = get()
TypeError: ('__init__() takes exactly 3 arguments (2 given)', <class 'ConfigParser.NoOptionError'>, ("No option 'inputfilename' in section: 'section-1'",))

Я добавил обработчик исключений для завершения процесса

try:
    ifile=cp.get(table,'inputfilename')
except ConfigParser.NoSectionError,ConfigParser.NoOptionError:
    usage("One of Parameter not found for"+ table)
    terminate()

но все еще ждет, не уверен, чего не хватает.

Ответы [ 2 ]

2 голосов
/ 23 января 2012

В Python 3.2+ это работает как положено. В Python 2 эта ошибка была исправлена ​​в r74545 и будет доступна в Python 2.7.3. В то же время вы можете использовать библиотеку configparser, которая является резервным портом configparser из 3.2+. Проверьте это.

0 голосов
/ 20 мая 2011

У меня была такая же проблема. Это происходит, когда рабочий процесс вызывает исключение user , которое имеет собственный конструктор. Убедитесь, что ваше исключение (в данном случае ConfigParser.NoOptionError) инициализирует базовое исключение с точно двумя аргументами:

class NoOptionError(ValueError):

    def __init__(self, message, *args):
        super(NoOptionError, self).__init__(message, args)
...