Не удалось получить отдельные экземпляры класса в mod_python.

StackOverflow https://stackoverflow.com/questions/204427

  •  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 использует одну и ту же область виртуальной памяти. в отдельном хранилище виртуальной памяти каждого процесса за каждый ваш одинаковый предмет для каждого ребенка.

Если вы действительно измените содержимое объектов и протестируете их, вы увидите, что, хотя расположение в памяти выглядит одинаково, это совершенно разные объекты, поскольку они принадлежат двум различным процессам.На самом деле вы не можете изменить одно из другого (без какого-либо межпроцессного взаимодействия).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top