Не удалось получить отдельные экземпляры класса в mod_python.
-
03-07-2019 - |
Вопрос
Я пытаюсь запустить код Python под Apache 2.2/mod_python 3.2.8.В конце концов код выполняет os.fork() и порождает 2 отдельных долгосрочных процесса.Каждый из этих процессов должен создать отдельный экземпляр класса, чтобы избежать возможных коллизий в параллельном потоке.
class Foo(object):
pass
kidprocs = []
for kid in ('kid1', 'kid2'):
pid = os.fork()
if pid:
# parent
kidprocs.append(pid)
time.sleep(5)
else:
# child
fooobj = Foo()
print "Starting %s in sub-process %s" % (kid, os.getpid())
print "Kid fooobj: %s" % repr(fooobj)
os._exit(0)
for kidproc in kidprocs:
os.waitpid(kidproc, 0)
Эти результаты печати выглядят следующим образом:
Starting kid1 in sub-process 20906
foo obj: <__main__.Foo instance at 0xb7da5fec>
Starting kid2 in sub-process 20909
foo obj: <__main__.Foo instance at 0xb7da5fec>
Как видите, я получил один и тот же объект для обоих подпроцессов.Есть ли у вас идеи, почему это происходит в mod_python и есть ли вообще способ получить отдельные экземпляры?Большое спасибо.
Решение
Местоположение памяти, заданное repr()
Функция — это адрес в виртуальной памяти, а не адрес в глобальной памяти системы.Каждый из ваших процессов, возвращаемых fork(), имеет собственное пространство виртуальной памяти, которое полностью отличается от других процессов.У них нет общей памяти.
Редактировать: Согласно комментариям Брайана ниже, технически они совместно используют память до тех пор, пока ядро не решит их разделить (когда дочерний элемент записывает в часть общей памяти).Однако поведение фактически такое же.
Структура ваших программ одинакова, поэтому Python использует одну и ту же область виртуальной памяти. в отдельном хранилище виртуальной памяти каждого процесса за каждый ваш одинаковый предмет для каждого ребенка.
Если вы действительно измените содержимое объектов и протестируете их, вы увидите, что, хотя расположение в памяти выглядит одинаково, это совершенно разные объекты, поскольку они принадлежат двум различным процессам.На самом деле вы не можете изменить одно из другого (без какого-либо межпроцессного взаимодействия).