在发出管理命令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"
是真的'然后代码创建一个线程,否则它会创建一个进程。那是为什么?
答案 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