Многопроцессорная обработка только с использованием одного потока вместо нескольких - PullRequest
0 голосов
/ 24 января 2020

Этот вопрос недавно задавался и решался несколько раз, но у меня есть довольно конкретный c пример ...

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

import pandas as pd
import multiprocessing as mp
from multiprocessing import get_context
mp.set_start_method('forkserver')


def multiprocess_function(func, iterator, input_data):
    result_list = []

    def append_result(result):
        result_list.append(result)

    with get_context('fork').Pool(processes=6) as pool:
        for i in iterator:
            pool.apply_async(func, args = (i, input_data), callback = append_result)
        pool.close()
        pool.join()

    return result_list
multiprocess_function(count_live, run_weeks, base_df)

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

if __name__ == '__main__':
    multiprocess_function()

Функция выполняется нормально, просто работает только в одном потоке в соответствии с выводом вверху.

Извинения, если это что-то невероятно простое - я не программист, я аналитик :)

edit: все работает абсолютно нормально, если я включаю в бот if__name__ == ' main ': et c Однако, когда я делаю это, мне нужно удалить параметры - может быть, просто что-то делать с областью видимости. Если я выполняю, вызывая функцию, независимо от того, параметризована она или нет, она работает только в одном потоке.

...