Я хотел бы расширить вопрос из Как в 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», так как на терминале ничего не печатается.
Что не так с кодом, который вы показали? Он работает без каких-либо исключений или сообщений об ошибках.
Привет, могу ли я попросить вас проверить, решит ли добавление if __name__ == "__main__" к Code_main.py вашу проблему, как я предложил в своем ответе. Спасибо






Я бы предложил немного изменить код. Вместо 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)
Можете ли вы объяснить, почему эти изменения должны решить заявленную проблему ФП?
Пока еще рано говорить, решат ли эти изменения проблему ОП, потому что он не написал, в чем заключается ошибка. Как я уже сказал в своем ответе, его код не вызывает никаких ошибок на моем компьютере.
То, что вы сказали об imap и карте (в данном конкретном случае), верно, но не имеет значения.
@SIGHUP не имеет отношения к чему?
Если он не описывает конкретную ошибку, обычно вопрос следует закрыть, а не ответить на него. См. раздел «Ответы на часто задаваемые вопросы» в разделе «Как отвечать». (Таким образом, я предполагаю, что «релевантное» в комментарии SIGHUP означает «релевантное для решения любой узкой, конкретной проблемы с соответствующим кодом»)
Итак, мы все согласились, что это один из вопросов, который рано или поздно будет закрыт, потому что в нем на самом деле нет воспроизводимых ошибок.
@JohnnyCheesecutter Предложение использовать map() вместо imap() является разумным комментарием. Поскольку «вопрос», по крайней мере, расплывчатый, практически невозможно дать какой-либо ответ до получения более подробной информации. Но это всего лишь мое мнение, которое обычно не имеет большого значения.
Спасибо за комментарий к моему ответу. Все имеет смысл.
Привет всем, спасибо за все ваши реакции. Мне удалось упростить работу моего кода, написав этот код «if name == «main»:» в начале всех моих процедур и используя «.map» внутри оператора «with». Спасибо вам всем.
как пишет Джонни, я не допустил здесь ошибку, извините. Поэтому я также попытался внести ваше исправление, но чтобы не зацикливаться на проблеме. Я пытался записать видео во время отладки, где я уверен, что «.map» вместо «.imap»:
ссылка: https://thewikihow.com/video_jIJnKaUrtRU
когда я использую «.imap», я не получаю никаких ошибок, код просто пропускает код в «Multicore_Patterns_List_processor», так как на терминале ничего не печатается.
Привет, не могли бы вы отредактировать свой вопрос и добавить эту информацию прямо в вопрос. Спасибо!
Также я обновил свой ответ. Пожалуйста, прочитайте подробности. Надеюсь, новое исправление поможет. Ваше здоровье.
«Это не работает»... было бы полезно, если бы вы объяснили, почему это не работает. Вы получаете ошибку? Неправильный результат? Какой результат?