многопроцессорность и сборка мусора

В py2.6+ модуль multiprocessingпредлагает класс Pool, поэтому можно сделать:

class Volatile(object):
    def do_stuff(self, ...):
        pool = multiprocessing.Pool()
        return pool.imap(...)

Однако со стандартной реализацией Python версии 2.7.2 такой подход вскоре приводит к ошибке «IOError: [Errno 24] Слишком много открытых файлов». По-видимому, объект poolникогда не собирает мусор, поэтому его процессы никогда не завершаются, накапливая все дескрипторы, открытые внутри. Я так думаю, потому что работает следующее:

class Volatile(object):
    def do_stuff(self, ...):
        pool = multiprocessing.Pool()
        result = pool.map(...)
        pool.terminate()
        return result

Я хотел бы сохранить "ленивый" подход к итератору imap; как в этом случае работает сборщик мусора? Как исправить код?

12
задан user124114 31 March 2012 в 23:11
поделиться