замена кода Python в двух экземплярах одной и той же программы

Можно ли скопировать все объекты памяти в вашей текущей программе Python, выполнив глубокую копию всех объектов памяти. Затем запустите другой экземпляр той же программы Python и переместите эти скопированные объекты во второй работающий экземпляр.


person P0ppy    schedule 03.02.2018    source источник
comment
Вы можете записать всю необходимую информацию во временный файл, а затем импортировать ее в новый экземпляр программы, например, загрузить сохраненный файл.   -  person Davy M    schedule 04.02.2018
comment
Я предлагаю вам взглянуть на модуль pickle. Это позволяет вам сохранить произвольный объект памяти Python в файл, а затем восстановить его в рабочем состоянии в другой программе.   -  person BoarGules    schedule 04.02.2018
comment
Затем я бы, вероятно, сохранил полный список объектов, которые мне нужно собрать/сохранить в эффективном формате файла. Повторно используйте эти объекты во втором экземпляре. Я думаю, если я попытаюсь сохранить его как можно более безгражданским, это определенно сработает. Есть ли побочные эффекты, которые я могу не заметить?   -  person P0ppy    schedule 04.02.2018
comment
Можете ли вы уточнить, что именно вы пытаетесь сделать? Создание нового экземпляра программы с тем же содержимым памяти, что и у существующего (форк), — это не то же самое, что перенос содержимого памяти одной программы в другую программу, работающую в другой системе.   -  person UnoriginalNick    schedule 04.02.2018
comment
Мой сценарий включает замену/обновление моего файла кода на моем Raspberry Pi без остановки программы. Я думал о том, чтобы создать еще один экземпляр той же программы, а затем передать право собственности второму экземпляру.   -  person P0ppy    schedule 04.02.2018
comment
Что вы подразумеваете под передачей права собственности на второй экземпляр? Вы не можете переместить запущенный процесс из одной системы в другую. Вы также не можете изменить код во время выполнения (по крайней мере, легко или безопасно). Можете ли вы привести очень конкретный пример того, что вы пытаетесь сделать.   -  person UnoriginalNick    schedule 04.02.2018
comment
я имею в виду, что я хочу закрыть первый экземпляр, как только второй экземпляр заработает. Право собственности фактически передается от первого ко второму.   -  person P0ppy    schedule 04.02.2018


Ответы (2)


Вы имеете в виду записать информацию в файл, запустить скрипт, который вы запускаете, а затем загрузить информацию? Если вы имеете в виду взять байты памяти и перераспределить их в другое место в вашей памяти только для использования в той же программе, я предлагаю вам посмотреть https://docs.python.org/3/library/sys.html и https://goshippo.com/blog/measure-real-size-any-python-object/

person heyguywhynotpy    schedule 03.02.2018
comment
я не думаю, что хочу измерить размер объекта. Я думаю запустить изменение кода на моем устройстве Raspberry Pi, не выключая его. - person P0ppy; 04.02.2018

Вот что делает разветвление программы. Когда вызывается os.fork(), дочерний процесс получает копию области памяти родителя, и оба возобновляют выполнение с одной и той же точки. Единственная разница в этих двух процессах заключается в возвращаемом значении вызова fork(), которое равно 0 для дочернего процесса и PID дочернего процесса для родителя.

Вот простой пример:

import os

x = 'val'

ret = os.fork()
# At this point, both processes have the same memory contents, except for the value of `ret`
print(ret, x)
# Now change the value in the child process
if ret == 0:
    x = 'newval'
print(ret, x)

Результат:

59751 val
59751 val
0 val
0 newval
person UnoriginalNick    schedule 03.02.2018
comment
Могу ли я отправить этот 'ret' val во второй процесс, замариновав его? - person P0ppy; 04.02.2018
comment
Существует несколько способов передачи данных между двумя процессами. Класс multiprocessing.Queue предоставляет простой потокобезопасный способ передачи данных между процессами. - person UnoriginalNick; 04.02.2018
comment
каковы некоторые из лучших практик копирования состояний в разных процессах? - person P0ppy; 04.02.2018
comment
Это слишком сложный вопрос, чтобы отвечать в комментариях. Существует много разных способов обмена данными между потоками в многопоточной программе, и это зависит от того, что вы пытаетесь сделать, и от конкретного языка, на котором вы пытаетесь это сделать. В общем, вам нужно избегать ситуаций, когда один поток зависит от вывода другого потока или когда два потока могут попытаться одновременно изменить один и тот же ресурс, что приведет к повреждению данных или взаимоблокировкам. Вы делаете это, разрабатывая свою программу так, чтобы она допускала многопоточность, используя взаимные исключения (блокировки, семафоры) и другие. - person UnoriginalNick; 04.02.2018