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