Django:RUN_MAIN'的意义环境变量

时间:2014-07-18 14:44:37

标签: thread-safety django-1.5

在发出管理命令runserver时,它使用加载程序运行服务器。在Django1.5的源代码中遇到了一段代码 在新流程/线程中启动服务器之前,如果它不是RUN_MAIN

,它会在环境变量中专门将'true'的值设置为'true'

的django / utils的/ autoreload.py

 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"是真的'然后代码创建一个线程,否则它会创建一个进程。那是为什么?

2 个答案:

答案 0 :(得分:0)

我查看django代码,然后我谷歌你的问题,错误没有回答。

我谈论我的想法。

首先,在python_reloader函数中,RUN_MAIN未定义,因此运行restart_with_reloader函数。 在restart_with_reloader中,在子流程RUN_MAIN中创建子流程True。 现在,父进程正在等待exit_code

python_reloader中的子进程为服务器启动一个新线程。接下来,子进程的主线程运行reloader_thread函数,当代码文件更改时,运行sys.exit(3),子进程退出,返回退出代码3.

父进程将运行下一个循环,创建其他子进程,然后重新启动服务器。 如果exit_code不是eq 3(例如,你按'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

答案 1 :(得分:0)

答案: 1)实际上,环境参数有助于管理许多过程。 2)原因是自动重载(保存文件时)。

您将在此处了解该过程:

http://programmersought.com/article/49721374106/;jsessionid=766C1F404087AC1E369350A887C32A21