В 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
; как в этом случае работает сборщик мусора? Как исправить код?