Замораживание многопроцессорной обработки Python

#python #multiprocessing

Вопрос:

Я пытаюсь запустить этот код, но он возвращает ошибку. Я этого не понимал. Что может привести к этому и как я должен устранить/устранить проблему?

Код:

 import pandas as pd
import spacy

dados = pd.read_csv('treino.csv')

nlp = spacy.load('pt_core_news_sm')

textos_para_tratamento = (titulos.lower() for titulos in dados['title'])

def trata_textos(doc):
   tokens_validos = []
   for token in doc:
      e_valido = not token.is_stop and token.is_alpha
      if e_valido:
         tokens_validos.append(token.text)
      if len(tokens_validos) > 2:
         return ' '.join(tokens_validos)

textos_tratados = [trata_textos(doc) for doc in nlp.pipe(textos_para_tratamento,
                                                    batch_size= 1000,
                                                    n_process = -1)]
 

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

Ошибка времени выполнения: Была предпринята попытка запустить новый процесс до того, как текущий процесс завершит фазу начальной загрузки.

Это, вероятно, означает, что вы не используете fork для запуска своего дочернего процесса и забыли использовать правильную идиому в главном модуле:

   if__name__=='__main__':
     freeze_support()
        ...
 

Строка «freeze_support()» может быть опущена, если программа
не будет заморожена для создания исполняемого файла.

Комментарии:

1. Казалось бы spacy , внутри используется многопроцессорная обработка, и некоторые вызовы библиотеки должны выполняться только в __main__ файле, а не при импорте файла. Это важно из — за того, как работает многопроцессорная обработка. использование этого if __name__ == "__main__": предложения предотвратит выполнение кода при импорте. freeze_support() требуется только в том случае, если вы планируете конвертировать свой сценарий в исполняемый файл Windows с помощью чего-то вроде pyinstaller.

Ответ №1:

Сообщение об ошибке указывает на необходимость реорганизации кода для запуска только один раз в главном модуле. Поскольку ваш код не может выполняться, как указано, я могу предложить только следующую реорганизацию:

 import pandas as pd
import spacy

def trata_textos(doc):
   tokens_validos = []
   for token in doc:
      e_valido = not token.is_stop and token.is_alpha
      if e_valido:
         tokens_validos.append(token.text)
      if len(tokens_validos) > 2:
         return ' '.join(tokens_validos)

if __name__ == '__main__':
    dados = pd.read_csv('treino.csv')
    nlp = spacy.load('pt_core_news_sm')
    textos_para_tratamento = (titulos.lower() for titulos in dados['title'])
    textos_tratados = [trata_textos(doc) for doc in nlp.pipe(textos_para_tratamento,
                                                             batch_size= 1000,
                                                             n_process = -1)]