Как я могу обработать tar-файл с помощью многопроцессорного пула Python?

Я пытаюсь обработать содержимое tar-файла с помощью multiprocessing.Pool . Я могу успешно использовать реализацию ThreadPool в модуле многопроцессорности, но хотел бы иметь возможность использовать процессы вместо потоков, поскольку это, возможно, будет быстрее и устранит некоторые изменения, внесенные в Matplotlib для обработки многопоточной среды. Я получаю сообщение об ошибке, которое, как я подозреваю, связано с процессами, не использующими совместно используемое адресное пространство, но я не знаю, как это исправить:

Traceback (most recent call last):
  File "test_tarfile.py", line 32, in <module>
    test_multiproc()
  File "test_tarfile.py", line 24, in test_multiproc
    pool.map(read_file, files)
  File "/ldata/whitcomb/epd-7.1-2-rh5-x86_64/lib/python2.7/multiprocessing/pool.py", line 225, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/ldata/whitcomb/epd-7.1-2-rh5-x86_64/lib/python2.7/multiprocessing/pool.py", line 522, in get
    raise self._value
ValueError: I/O operation on closed file

Фактическая программа более сложна, но это пример того, что я делаю. который воспроизводит ошибку:

from multiprocessing.pool import ThreadPool, Pool
import StringIO
import tarfile

def write_tar():
    tar = tarfile.open('test.tar', 'w')
    contents = 'line1'
    info = tarfile.TarInfo('file1.txt')
    info.size = len(contents)
    tar.addfile(info, StringIO.StringIO(contents))
    tar.close()

def test_multithread():
    tar   = tarfile.open('test.tar')
    files = [tar.extractfile(member) for member in tar.getmembers()]
    pool  = ThreadPool(processes=1)
    pool.map(read_file, files)
    tar.close()

def test_multiproc():
    tar   = tarfile.open('test.tar')
    files = [tar.extractfile(member) for member in tar.getmembers()]
    pool  = Pool(processes=1)
    pool.map(read_file, files)
    tar.close()

def read_file(f):
    print f.read()

write_tar()
test_multithread()
test_multiproc()

Я подозреваю, что что-то не так, когда объект TarInfo передается в другой процесс, а родительский TarFile - нет, но я не уверен, как чтобы исправить это в случае многопроцессорности. Могу ли я сделать это без извлечения файлов из архива и записи их на диск?

7
задан Tim Whitcomb 23 November 2011 в 23:02
поделиться