Python – многопроцессорность и передача переменных для каждого вызова (но во внешней функции)

Я хотел бы расширить вопрос из Как в Python передать значения локальных переменных в пул многопроцессорной библиотеки?

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

К примеру: Код файла1:

import Code

result = Code.Main_Code()
print(result)

Код файла2:

from multiprocessing import Pool

def Multicore_Patterns_List_processor(args):

    Variable1, Variable2, Variable3, Pattern = args
    print(f"{Variable1=}, {Variable2=}, {Variable3=}, current pattern is {Pattern}")

def gen_args(Variable1, Variable2, Variable3):
    for p in range(10):
        yield Variable1, Variable2, Variable3, p

def Main_Code():
    Variable1 = 1
    Variable2 = 2
    Variable3 = 3
    MultiCores = 3
    print("Finish of simple code and start of heavy code in parralel")
    with Pool(processes=MultiCores) as pool:
        pool.imap(Multicore_Patterns_List_processor, gen_args(Variable1, Variable2, Variable3))
        pool.close()
        pool.join()

    print("Finish of heavy code and continue of simple code")
    done = True
    return done

Это не работает.

Я пытаюсь достичь состояния, в котором я позволю Python обрабатываться одним процессором, потому что код прост, а позже в файле «Code.py» есть более тяжелый код, который позволяет обрабатывать параллельно и благодаря этому ускорять работу. время обработки локальной функции (поскольку функция обрабатывается несколько раз 10). После этого Python должен продолжить работу в одном процессоре, чтобы завершить простой код.

UPD: как пишет Johny, я не сюда вставил ошибку, извините. Поэтому я также попытался внести ваше исправление, но чтобы не зацикливаться на проблеме. Я пытался записать видео во время отладки, где я уверен, что «.map» вместо «.imap»:

ссылка: https://thewikihow.com/video_jIJnKaUrtRU

когда я использую «.imap», я не получаю никаких ошибок, код просто пропускает код в «Multicore_Patterns_List_processor», так как на терминале ничего не печатается.

«Это не работает»... было бы полезно, если бы вы объяснили, почему это не работает. Вы получаете ошибку? Неправильный результат? Какой результат?

Anentropic 28.05.2024 17:12

Что не так с кодом, который вы показали? Он работает без каких-либо исключений или сообщений об ошибках.

SIGHUP 28.05.2024 17:44

Привет, могу ли я попросить вас проверить, решит ли добавление if __name__ == "__main__" к Code_main.py вашу проблему, как я предложил в своем ответе. Спасибо

Johnny Cheesecutter 29.05.2024 15:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы предложил немного изменить код. Вместо imap используйте map. И вам не нужно делать join и close, если вы запускаете Pool внутри контекста (внутри оператора with). В противном случае все работает нормально.

from multiprocessing import Pool, cpu_count
...

    MultiCores = cpu_count()
    print("Finish of simple code and start of heavy code in parralel")
    with Pool(processes=MultiCores) as pool:
        res = pool.map(Multicore_Patterns_List_processor, 
                       gen_args(Variable1, Variable2, Variable3))

UPD: Еще одна вещь, которая была очевидна, но я упустил из виду в своем ответе: код основного потока выполняется без защиты оператора __name__ == "main". Когда Python пытается создать новые процессы, он копирует все ваши модули в каждый поток. После копирования модулей они импортируются и выполняют все, что не защищено оператором if __name__ == "main":. Таким образом, поток, который был создан только что, начинает инициировать создание других потоков, а затем этот процесс переходит в бесконечный цикл.

Ниже приведено решение вашей проблемы:

# Code_main.py
import Code


if __name__ == "__main__":
    result = Code.Main_Code()
    print(result)

Можете ли вы объяснить, почему эти изменения должны решить заявленную проблему ФП?

Charles Duffy 28.05.2024 17:38

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

Johnny Cheesecutter 28.05.2024 17:45

То, что вы сказали об imap и карте (в данном конкретном случае), верно, но не имеет значения.

SIGHUP 28.05.2024 17:45

@SIGHUP не имеет отношения к чему?

Johnny Cheesecutter 28.05.2024 17:47

Если он не описывает конкретную ошибку, обычно вопрос следует закрыть, а не ответить на него. См. раздел «Ответы на часто задаваемые вопросы» в разделе «Как отвечать». (Таким образом, я предполагаю, что «релевантное» в комментарии SIGHUP означает «релевантное для решения любой узкой, конкретной проблемы с соответствующим кодом»)

Charles Duffy 28.05.2024 18:10

Итак, мы все согласились, что это один из вопросов, который рано или поздно будет закрыт, потому что в нем на самом деле нет воспроизводимых ошибок.

Johnny Cheesecutter 28.05.2024 18:24

@JohnnyCheesecutter Предложение использовать map() вместо imap() является разумным комментарием. Поскольку «вопрос», по крайней мере, расплывчатый, практически невозможно дать какой-либо ответ до получения более подробной информации. Но это всего лишь мое мнение, которое обычно не имеет большого значения.

SIGHUP 28.05.2024 18:29

Спасибо за комментарий к моему ответу. Все имеет смысл.

Johnny Cheesecutter 28.05.2024 19:30

Привет всем, спасибо за все ваши реакции. Мне удалось упростить работу моего кода, написав этот код «if name == «main»:» в начале всех моих процедур и используя «.map» внутри оператора «with». Спасибо вам всем.

Jan Vaško 31.05.2024 14:22

как пишет Джонни, я не допустил здесь ошибку, извините. Поэтому я также попытался внести ваше исправление, но чтобы не зацикливаться на проблеме. Я пытался записать видео во время отладки, где я уверен, что «.map» вместо «.imap»:

ссылка: https://thewikihow.com/video_jIJnKaUrtRU

когда я использую «.imap», я не получаю никаких ошибок, код просто пропускает код в «Multicore_Patterns_List_processor», так как на терминале ничего не печатается.

Привет, не могли бы вы отредактировать свой вопрос и добавить эту информацию прямо в вопрос. Спасибо!

Johnny Cheesecutter 29.05.2024 10:22

Также я обновил свой ответ. Пожалуйста, прочитайте подробности. Надеюсь, новое исправление поможет. Ваше здоровье.

Johnny Cheesecutter 29.05.2024 10:30

Другие вопросы по теме