Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
104 / 15 / 3
Регистрация: 29.11.2010
Сообщений: 335

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

09.08.2018, 09:32. Показов 1569. Ответов 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
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 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
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 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
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru