104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335

Как правильно вынести мультипроцессорную часть кода?

09.08.2018, 09:32. Показов 1587. Ответов 7

Студворк — интернет-сервис помощи студентам
У меня имеется примерно следующий каркас кода, который имеет класс myclass в котором осуществляется вызов мультипроцессорной "функции", выполняющей одновременно два процесса: р1 и р2.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def worker_proc1(args):
 
    # некоторый код
 
def worker_proc2(args2):
 
    # некоторый код
 
class myclass:
 
    def consumer():
 
        p1 = multiprocessing.Process(target=worker_proc1, args=(11, ))
        p2 = multiprocessing.Process(target=worker_proc2, args=(22, ))
 
        jobs.append(p1)
        jobs.append(p2)
 
        p1.start()
        p2.start()
 
        p1.terminate()
        p2.terminate()
 
 
    if __name__ == '__main__':
 
        consumer()
 
 
if __name__ == '__main__':
    multiprocessing.freeze_support()
    multiprocessing.set_start_method('spawn')
 
    # некоторый код в main
 
    myclass()
При порождении каждого процесса создается копия самого скрипта и соответственно выполняется код, который расположен в точке входа скрипта:

Python
1
    # некоторый код в main
К тому же перед всем этим делом идут вызовы всех библиотек, которые используются в скрипте: в том числе и тех, которые не используются в мультипроцессорных функциях worker_proc1() и worker_proc2().
В итоге получается все как надо: создается еще один интерпретатор питона для каждого процесса, исполняется, закрывается. Но как видите, тут могут быть накладные расходы: вызовы левых библиотек, выполнение кода в main...

В итоге встает вопрос, как правильно вынести мультипроцессорную часть, за пределы скрипта, чтобы вызывать только то, что надо, а не все?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2018, 09:32
Ответы с готовыми решениями:

Вынести часть кода
from collections import Counter def sleight_of_hand(k, matrix): c = Counter(int(x) for row in matrix for x in row...

Как вынести часть кода в процедуру?
Вот код программы, как выделенное вынести в процедуру? program privet; label 1; var a,b,i:integer; begin i:=0; a:=500; ...

Вынести основную часть кода кода в отдельную функцию
помогите пожалуйста переделать это на функцию... #include <locale.h> #include <conio.h> int main() { setlocale(0,""); ...

7
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
09.08.2018, 13:00
Распространённая проблема на винде.
https://docs.python.org/2/libr... ml#windows
0
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335
09.08.2018, 14:21  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Распространённая проблема на винде.
Да, это спасибо, читал) вопрос про другое: про то, как правильно вынести мультипроцессорную часть за пределы основного кода, который идет последовательно и в одном процессе.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
09.08.2018, 17:07
Gudsaf, не понял. Что значит "вынести за пределы"? В другой модуль, что ли? Вроде бы, это просто.
Другие процессы и так идут отдельно от основного по определению.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
10.08.2018, 12:51
Цитата Сообщение от Gudsaf Посмотреть сообщение
При порождении каждого процесса создается копия самого скрипта и соответственно выполняется код, который расположен в точке входа скрипта
Код в main выполняется один раз; копия скрипта не создаётся. Поэтому, если очень хочется, импорты можно внести в main, или вынести мультипроцессорную часть в отдельный модуль (если очень очень хочется). Однако, если импортируемые модули не слишком тяжеловесны (прям совсем), беспокоиться, пожалуй, не стоит.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
10.08.2018, 13:44
Цитата Сообщение от shsv Посмотреть сообщение
Код в main выполняется один раз; копия скрипта не создаётся.
На винде это не совсем так.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
10.08.2018, 15:29
dondublon, multiprocessing не выполняет скрипт дважды.

Новый процесс он создает примерно так
Windows Batch file
1
python -c prog
где prog - строка, содержащая функцию из multiprocessing; последняя принимает параметром хэндл пайпа, по которому вновь созданному процессу передается экземпляр Process (созданный нашим скриптом). Для передачи по пайпу его необходимо сериализовать. Когда маринатор (pickle) в новорожденном процессе распаковывает объект Process, он импортирует наш скрипт, чтобы извлечь функцию target. Именно в этот момент скрипт исполняется вторично. Исключая, конечно, блок main, т.к. условие if __name__ == '__main__': не выполнено.

То бишь, код в main выполняется один раз; копия скрипта не создаётся.

Так работает метод spawn, единственно доступный в окошках.
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
14.08.2018, 22:39
Я не прав.

Прямо перед тем как передать замаринованные данные pickle для распаковки, multiprocessing действительно запускает скрипт. Чтобы перетянуть в новый процесс глобальные имена. Исполняет скрипт runpy.run_path; при этом __name__ == '__mp_main__'. Так что да, можно сказать, что копия скрипта имеет место быть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2018, 22:39
Помогаю со студенческими работами здесь

Вынести часть кода в функцию
Есть вот такой вот участок кода.Помогите пожалуйста сделать функцию(там где написано функ) for( int i=0;i<c ;i++) { ...

Вынести часть кода в функцию
Помогите преобразовать в функцию выделенную часть кода #include "stdafx.h" #include <cmath> #include <iostream> ...

Вынести часть кода в функцию
Добрый день. Есть несколько StringGrid и есть код по считыванию , к примеру, из строки StringGrid1, сортировке его ячеек с последующей...

Вынести часть кода в функцию
Скажите пожалуйста как сделать нахождение основных значений через функцию RESHENIE(), а ввод данных и вывод через функцию MAIN() ...

Вынести часть кода в отдельный файл
Есть не большой сайтик. Cобран из html страниц и один банер в верху. Если изменять банер - нужно редактировать каждую страницу, а это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru