还是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并退出

更多相关文章

  1. python:如何在Linux中编写守护进程
  2. python (9)统计文件夹下的所有文件夹数目、统计文件夹下所有文件数
  3. 使用Python写HTML 文件使用jinja2中的模板
  4. Python读取修改ini配置文件[ConfigParser]
  5. 用户输入从.csv文件生成新列表?
  6. Python文件操作大全,随机删除文件夹内的任意文件
  7. 当使用一个传送到另一个的python文件时,我可以将stdin与argv结合
  8. 从Django开发服务器的根服务提供静态文件
  9. Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标

随机推荐

  1. 如何使用java语言求一个正整数的平方根?(自
  2. java多线程(4)使用wait/notify机制进行单线
  3. android 访问webservice问题
  4. java集合系列(11)TreeSet
  5. java多线程(5)多线程通信出现的假死现象分
  6. 这篇文章带你彻底理解synchronized关键字
  7. 聊聊java中NIO的增强版AIO
  8. 如果你现在的生活呆腻了,尝试着去改变一下
  9. java中的final关键字解析
  10. android与服务器交互方式