#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)]