2014-07-18 5 views
1

관리 명령 runserver을 발행하는 동안 로더를 사용하여 서버를 실행합니다. 자신이 아닌 경우 소스에서 Django1.5의 코드가 새로운 프로세스/스레드에서 서버를보고하기 전에, 그것은 특별히 환경 변수에 'true'RUN_MAIN의 값을 설정 코드 의 조각을 건너 온 'true'Django : 'RUN_MAIN'환경 변수의 중요성

장고/유틸/자동 리로드 이 만이 새로운 프로세스/스레드를 생성 설정된 경우, 그 값의 값이 아닌 OT 설정되는 경우 평 다른 코드 조각

new_environ = os.environ.copy() 
new_environ["RUN_MAIN"] = 'true' 
exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ) 

그것을 체크한다.

if os.environ.get("RUN_MAIN") == "true": 
     thread.start_new_thread(main_func, args, kwargs) 

기본적으로 시스템 (linux2)에서는 값을 설정하지 않습니다.

쿼리 : 해당 환경 변수의 중요성과 방법이 새로운 프로세스/스레드를 시작 관련되어 어떤

1).

2) "RUN_MAIN"이 '참'이면 코드가 스레드를 생성하고, 그렇지 않으면 프로세스를 생성합니다. 그게 왜?

답변

0

나는 django 코드를 볼 수 있습니다. 그렇다면 Google이 귀하의 질문에 버그를 대답하지 않습니다.

나는 내 아이디어에 대해 이야기합니다.

먼저 python_reloader 함수에서 RUN_MAIN이 정의되어 있지 않으므로 restart_with_reloader 함수를 실행하십시오. 에 restart_with_reloader, 하위 프로세스에서 자식 프로세스를 생성하십시오. RUN_MAINTrue입니다. 지금은 부모 프로세스 대기 exit_code입니다.

자식 프로세스에서 python_reloader은 (는) 서버용 새로운 스레드를 시작합니다. 그런 다음 하위 프로세스의 주 스레드는 reloader_thread 함수를 실행하고 코드 파일이 변경되면 sys.exit(3)을 실행하고 하위 프로세스가 종료되면 종료 코드 3을 반환합니다.

부모 프로세스는 다음 루프를 실행하고 다른 하위 프로세스를 만든 다음 서버를 다시 부팅합니다. exit_code이 아닌 경우 (예 : 'ctrl-c'를 누름) restart_with_reloader 함수 부모 코드가 exit_code이고 코드 실행이 끝납니다.

영어가 끔찍하다. 이해해 주시면 감사하겠습니다.

def reloader_thread(): 
    while RUN_RELOADER: 
     # waiting code change 
     if code_changed(): 
      sys.exit(3) # force reload 

def restart_with_reloader(): 
    while True: 
     new_environ = os.environ.copy() 
     new_environ["RUN_MAIN"] = 'true' 
     # create a child process 
     exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ) 
     if exit_code != 3: 
      # end 
      return exit_code 

def python_reloader(main_func, args, kwargs): 
    if os.environ.get("RUN_MAIN") == "true": 
     # new thread in child process 
     thread.start_new_thread(main_func, args, kwargs) 
     try: 
      reloader_thread() 
     except KeyboardInterrupt: 
      pass 
    else: 
     try: 
      exit_code = restart_with_reloader() 
      if exit_code < 0: 
       os.kill(os.getpid(), -exit_code) 
      else: 
       sys.exit(exit_code) 
     except KeyboardInterrupt: 
      pass