문제

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