Bottle 框架源码学习 四
16lz
2021-01-22
还是run函数,本节主要分析reload机制,下面是生成临时锁文件,并生成子线程运行服务代码
defrun(app=None,server='wsgiref',host='127.0.0.1',port=8080,interval=1,reloader=False,quiet=False,plugins=None,
debug=None,**kargs):
ifNORUN:return
ifreloaderandnotos.environ.get('BOTTLE_CHILD'):
try:
lockfile=None
fd,lockfile=tempfile.mkstemp(prefix='bottle.',suffix='.lock')
os.close(fd)#Weonlyneedthisfiletoexist.Weneverwritetoit
whileos.path.exists(lockfile):
args=[sys.executable]+sys.argv
environ=os.environ.copy()
environ['BOTTLE_CHILD']='true'
environ['BOTTLE_LOCKFILE']=lockfile
p=subprocess.Popen(args,env=environ)
whilep.poll()isNone:#Busywait...
os.utime(lockfile,None)#Iamalive!
time.sleep(interval)
ifp.poll()!=3:
ifos.path.exists(lockfile):os.unlink(lockfile)
sys.exit(p.poll())
exceptKeyboardInterrupt:
pass
finally:
ifos.path.exists(lockfile):
os.unlink(lockfile)
return
安全地址创建临时文件
fd,lockfile=tempfile.mkstemp(prefix='bottle.',suffix='.lock')
prefix为前缀,suffix为后缀
返回一个元组,fd为文件句柄,lockfile为文件路径
os.close(fd)
因为后面只需要用lockfile来监测文件是否存在,所以关闭句柄
args=[sys.executable]+sys.argv
如果我的主运行脚本路径为,
则sys.argv为/usr/app/main.py
python执行路径为/usr/local/bin/python
则args 为["/usr/local/bin/python", "/usr/app/main.py"]
environ=os.environ.copy()environ['BOTTLE_CHILD']='true'environ['BOTTLE_LOCKFILE']=lockfilep=subprocess.Popen(args,env=environ)
为了不影响主进程的环境变量,复制一份环境变量并增加两个KEY传递给子进程。
如果不指定env,则会自动继承当前进程的env
通过subprocess.Popen返回Popen对象p
whilep.poll()isNone:#Busywait...os.utime(lockfile,None)#Iamalive!time.sleep(interval)ifp.poll()!=3:ifos.path.exists(lockfile):os.unlink(lockfile)sys.exit(p.poll())
while p.poll() is None: 通过while循环判断子进程是否执行中,如果是None,则正在执行中,因为服务器进程一般来说是run_forever的。
os.utime(lockfile, None) 设置lockfile的修改时间为当前时间
if p.poll() != 3: 为什么要定义3呢?是由于后面有段代码指定,如果退出符号为3,即视为需要重新reload
ifbgcheck.status=='reload':sys.exit(3)
如果产生的非3的返回值,则删除lockfile并退出
更多相关文章
- python:如何在Linux中编写守护进程
- python (9)统计文件夹下的所有文件夹数目、统计文件夹下所有文件数
- 使用Python写HTML 文件使用jinja2中的模板
- Python读取修改ini配置文件[ConfigParser]
- 用户输入从.csv文件生成新列表?
- Python文件操作大全,随机删除文件夹内的任意文件
- 当使用一个传送到另一个的python文件时,我可以将stdin与argv结合
- 从Django开发服务器的根服务提供静态文件
- Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标