Arhn - архитектура программирования

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

У меня есть приложение python, которое собирается создать процесс для каждого элемента данной коллекции входов. Входные данные представляют собой набор из примерно 8 элементов. И приложение периодически читает тему, чтобы получить 8 элементов.

Для каждого элемента ввода я создаю новый процесс и передаю ввод функции.

Функция связана с процессором по своей природе, она выполняет числовые операции.

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

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

Например:

# cpu intensive operation
def cpu_bound(input):
    ...  # complex cpu bound op
    # I want to use config here

    return output


def get_config():
    # create configuration object
    config = {
        "version": 1,
        "disable_existing_loggers": False,
        "loggers": {
            "": {
                "level": "INFO"
            }, 
            "another.module": {
                "level": "DEBUG"
            }
        }
    }


def pool_handler(inputs):
    p = Pool(8)  # 8 core machine
    results = p.map(cpu_bound, inputs)
    return results


if __name__ == "__main__":

    config = get_config()
    # get inputs from a topic
    inputs = get_inputs()
    results = pool_handler(inputs)

Вопрос Каков рекомендуемый подход к использованию конфигурации в каждом процессе? Конфигурация по своей природе доступна только для чтения, так как мне нужно загрузить ее только один раз при загрузке приложения. Есть несколько способов, но каков рекомендуемый подход для этого сценария?


  • Что именно вы подразумеваете под только для чтения? Есть ли какая-то особая проблема с тем, что у вас есть сейчас? 06.06.2020
  • Я должен был упомянуть. Спасибо. Только для чтения, мне нужно создать его только один раз для моего приложения, прежде чем я запрошу тему. Мой вопрос: как лучше всего обмениваться данными? 06.06.2020
  • Не знаю, просто передать как аргумент? 06.06.2020
  • Если не знаешь, пусть другие ответят 06.06.2020
  • @InfoLearner: если cpu_bound нужна дополнительная информация, передайте ее функции. Если у вас закончится память, это не из-за этого маленького объекта конфигурации. 06.06.2020
  • Спасибо. Я хочу создать шаблон для команды. Объект конфигурации будет расти с объектами API и другими объектами. Я заметил, что объем памяти увеличивается, когда я передаю его в качестве аргумента методу. Есть ли способ устранить это, чтобы я не копировал объект? Должен ли я использовать значение, массив, очередь и т. д.? 06.06.2020
  • stackoverflow.com/a/38135787/594589 06.06.2020
  • Спасибо, что пожалели. Это было правильное и разумное решение 08.06.2020

Ответы:


1

Правильный способ обмена статической информацией внутри multiprocessing.Pool заключается в использовании функции initializer для установки ее через ее initargs.

Две приведенные выше переменные фактически передаются Pool рабочим процессам как Process параметры конструктора, следуя рекомендациям руководство по многопроцессорному программированию.

Явно передавать ресурсы дочерним процессам

В Unix, использующем метод запуска fork, дочерний процесс может использовать общий ресурс, созданный в родительском процессе с использованием глобального ресурса. Однако лучше передать объект в качестве аргумента конструктору дочернего процесса.

variable = None


def initializer(*initargs):
    """The initializer function is executed on each worker process
    once they start.

    """
    global variable

    variable = initargs


def function(*args):
    """The function is executed on each parameter of `map`."""
    print(variable)


with multiprocessing.Pool(initializer=initializer, initargs=[1, 2, 3]) as pool:
    pool.map(function, (1, 2, 3))
07.06.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..