Я работаю над большим скриптом, основная цель которого - прочитать содержимое многих файлов и сохранить номер каждого элемента в словаре. Если элемент отсутствует в словаре, то мы создаем новый экземпляр какого-то объекта и затем увеличиваем его, иначе только увеличиваем. Поскольку каждый из обрабатываемых файлов сам по себе огромен, и иногда мне нужно обработать более 100 из них, я хотел немного ускорить процесс и воспользоваться преимуществами многопроцессорного модуля Python. Вот сильно упрощённая версия скрипта (путь я скрыл с помощью ..., он не настоящий):
import multiprocessing as mp
from os import listdir
from os.path import join
manager = mp.Manager()
queue = manager.Queue()
dictionary = manager.dict()
class TestClass:
def __init__(self):
self._number = 0
def increment(self):
self._number += 1
def worker(file):
f = open(file, 'r')
for line in f.readlines():
if line not in dictionary:
dictionary[line] = TestClass()
dictionary[line].increment()
def _list_files():
for f in listdir("..."):
queue.put(join("...", f))
def pool():
_list_files()
_pool = mp.Pool(mp.cpu_count())
for i in range(len(queue)):
_pool.apply(worker, args=(queue.get()))
_pool.close()
_pool.join()
pool()
print(dictionary)
Проблема в том, что скрипт вылетает с сообщением:
AttributeError: Can't get attribute 'TestClass' on <module '__main__' from '.../multiprocessing_test.py'>
Есть ли способ заставить это работать?
Я не тот, кто создал начальную версию скрипта, я просто добавляю в него некоторые функции. При этом структура скрипта должна остаться прежней, т.к. переписывание заняло бы слишком много времени, то есть TestClass
, worker
и list_files
не могут изменить свою структуру (кроме всего, что связано с многопроцессорностью)