Python вызывает несколько функций параллельно и объединяет результат - PullRequest
0 голосов
/ 08 октября 2019

Мне нужно написать работу для выполнения разностного анализа данного документа. Я знаю, что могу сделать последовательно, то есть, вызывать каждый синтаксический анализатор один за другим. Структура сценария очень высокого уровня приведена ниже

def summarize(doc):
    pass
def LengthCount(doc):
    pass
def LanguageFinder(doc):
    pass
def ProfanityFinder(doc):
    pass

if __name__ == '__main__':
    doc = "Some document"
    smry = summarize(doc)
    length = LengthCount(doc)
    lang = LanguageFinder(doc)
    profanity = ProfanityFinder(doc)

    # Save sumary, length, language, profanity information in database

Но для повышения производительности, я думаю, эти задачи могут выполняться параллельно. Как я могу это сделать. Каковы возможные пути для этого в Python особенно версии 3.x. Вполне возможно, что один анализатор (модуль) займет больше времени, чем другие, но в целом, если их можно запустить параллельно, это увеличит производительность. Наконец, если это невозможно в Python, также приветствуется любой другой язык.

1 Ответ

0 голосов
/ 08 октября 2019

В Python у вас есть несколько вариантов параллелизма / параллелизма. Существует модуль threading, который позволяет выполнять код в нескольких логических потоках, и модуль multiprocessing, который позволяет создавать несколько процессов. Существует также модуль concurrent.futures, который предоставляет API для обоих этих механизмов.

Если ваш процесс связан с ЦП (т. Е. Вы используете 100% ЦП, доступного для Python повсюду - обратите внимание, что этоне 100% ЦП, если у вас многоядерный или гиперпоточный компьютер) вы вряд ли увидите много преимуществ от многопоточности, так как в действительности это не использует несколько потоков ЦП параллельно, а просто позволяет переходить от одного к другому, покаСначала ждет IO. Многопроцессорная обработка, вероятно, будет более полезной для вас, поскольку она позволяет вам работать с несколькими потоками ЦП. Вы можете запустить каждую из ваших функций в своем собственном процессе, используя класс Process:

import multiprocessing

#function defs here 

p = multiprocessing.Process(target=LengthCount, args=(doc,))
p.start()
# repeat for other processes

Вам нужно настроить свой код, чтобы функции возвращались к общей переменной (или записывали прямо в вашу базу данных)чем напрямую вернуть свой результат, чтобы вы могли получить к ним доступ после завершения процесса.

...