Совместное использование ресурсов между процессами Python

#python

#python

Вопрос:

Я хочу разделить несколько ресурсов между несколькими скриптами Python. В идеале то, что я пытаюсь сделать, это запустить мою основную программу. Он содержит некоторые переменные для всего скрипта. Затем я хочу перенести точно такую же программу в новую оболочку и предоставить ей доступ к переменным моего скрипта.

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

Ответ №1:

Вы можете использовать Value и Array из multiprocessing для общей памяти между процессами.

Пример из multiprocessing документации:

 from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])
  

выведет:

 3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
  

Комментарии:

1. Это передача по ссылке или передача по значению? Например, если вновь созданный процесс изменяет переменную, получит ли обновление основной процесс?

2. Value и Array классы являются абстракциями для выделения общей памяти, поэтому да, обновления, внесенные в экземпляры этих классов из любого процесса, будут отражены во всех процессах, имеющих доступ к экземплярам.

3. Возможно ли, чтобы этот новый процесс появился в новом окне терминала?

4. Нет, новое окно терминала означает новую оболочку, которая отделяется от multiprocessing управляемой совместно используемой памяти. Если вам нужно создать новое окно терминала, вам придется использовать subprocess.Popen и взаимодействовать с ним через канал, без возможности использования общей памяти.

5. Я планирую создать клиент-серверное приложение. Сервер будет разбит на две части. Основная программа, которая обрабатывает все соединения и полученные данные. Затем я хочу иметь возможность открывать другие оболочки, запускать ту же программу, но просто получать данные. Таким образом, каждая оболочка дает мне возможность взаимодействовать с клиентом, который подключен к серверу. Будут ли каналы способом сделать это? Будут ли локальные сокеты лучше?