mod_python에 따라 클래스의 별도 인스턴스를 얻지 못했습니다.
-
03-07-2019 - |
문제
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은 동일한 가상 메모리 위치를 사용합니다. 각 프로세스의 고유 한 가상 메모리 저장소에서 각 어린이에 대한 각각의 동일한 대상에 대해.
실제로 객체의 내용을 수정하고 테스트하는 경우 메모리 위치가 동일하게 보이지만 두 가지 프로세스에 속하기 때문에 두 가지가 완전히 다른 객체임을 알 수 있습니다. 실제로 당신은 다른 사람으로부터 하나를 수정할 수 없습니다 (중재하기 위해 어떤 종류의 간호 의사 소통없이).