Не удалось получить отдельные экземпляры класса в mod_python - PullRequest
2 голосов
/ 15 октября 2008

Я пытаюсь запустить некоторый код 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 и есть ли способ получить отдельные экземпляры? Большое спасибо.

1 Ответ

3 голосов
/ 15 октября 2008

Область памяти, заданная функцией repr(), является адресом в виртуальной памяти, а не адресом в глобальной памяти системы. Каждый из ваших процессов, возвращаемых fork (), имеет свое собственное пространство виртуальной памяти, которое полностью отличается от других процессов. Они не разделяют память.

Редактировать: Согласно комментариям Брайана ниже, технически они разделяют память до тех пор, пока ядро ​​не решит их разделить (когда ребенок записывает часть общей памяти). Поведение, однако, фактически то же самое.

Структура ваших программ одинакова, поэтому python использует одну и ту же область виртуальной памяти в отдельном хранилище виртуальной памяти каждого процесса для каждого идентичного объекта для каждого дочернего элемента.

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

...