python程序 如何 结束自身 延时1分钟 然后重启自身

2014-01-08 14:18:26 +08:00
 fdsfsdfsdf3334
我的程序是个采集程序

有时候 可能数据库出现问题 比如连接不上

我使用了 try 语句

在出错的时候,我想让他 延时1分钟, [也就是等待一分钟,]

然后重启自身 [重新启动 重新连接]
11383 次点击
所在节点    问与答
28 条回复
tan9le
2014-01-08 14:34:28 +08:00
不可以是两个python程序么?A程序就是你的正常应用,发生异常以后将错误码作为参数唤起B应用,B应用记录LOG信息,sleep/wait一分钟以后唤起A应用,同时B应用结束。
loading
2014-01-08 14:54:33 +08:00
@tan9le 求demo
a591826944
2014-01-08 14:56:13 +08:00
time 不是有个sleep么 你可一 try 失败的时候 sleep啊 然后 递归 不久好了么
tan9le
2014-01-08 15:08:47 +08:00
@loading 木有demo,我是做J2EE的,Python应该也有类似于Java中的Runtime.exec的机制吧,就是调用系统命令。

刚刚查了一下,import os之后,os module里的popen、system方法貌似都可以调用系统命令,可以os.system('命令');来执行呀,python Path of B程序就是了。
clino
2014-01-08 15:10:03 +08:00
用 supervisor 来管理这样的进程吧, 配置一下相关参数就可以了
loryyang
2014-01-08 15:16:19 +08:00
你为什么一定要退出?你确定有必要这么做吗?
strak47
2014-01-08 15:21:06 +08:00
time.sleep(60)就行了吧
nybux
2014-01-08 15:24:41 +08:00
后台启动一个shell执行,sleep 60 && <你的脚本>
类似于这样:
echo "sleep 60 && echo 'a'" | sh
ritksm
2014-01-08 15:29:51 +08:00
为什么没有人提http://docs.python.org/2/library/subprocess.html

a.py用subprocess调用b.py.然后监控退出.异常退出重启即可
a.py可以有自己的退出逻辑,不如b.py失败10次,一个while的事情
fdsfsdfsdf3334
2014-01-08 15:41:31 +08:00
@loryyang 退出的目的是为了重启, 连接失败后,我该怎么引导程序再次执行链接数据库呢 如果一直连接不上呢 不太方便哦 又要写很多代码 主要是太麻烦了 重启比较简单
Maslino
2014-01-08 16:25:38 +08:00
@fdsfsdfsdf3334 ORM或者数据库driver一般可以配置自动重连。如果抛异常,考虑截住异常然后sleep一段时间(比如指数退避)然后重试。
loryyang
2014-01-08 16:52:06 +08:00
@fdsfsdfsdf3334 总感觉从程序逻辑讲,处理连接异常也是你的python程序需要处理的一种情况,把这种情况交给python外部的程序处理有点责任混乱了。
但是如果是你自己玩玩那倒无所谓,你用一个守护进程就ok了,守护进程通过pid监控python程序,如果发现python程序消失了,sleep60秒,重启python程序就ok
fdsfsdfsdf3334
2014-01-08 17:05:30 +08:00
@loryyang 是个企业级应用 同步公司的一些数据 目前 可以长期运行在服务器上, 不会出现意外,唯一的意外是 如果远程数据库重启了, 那么这里的成就会报错 奔溃, 目前我还没写 数据库连接的容错代码,想选个安全 高效 齐全的方法
9hills
2014-01-08 17:14:11 +08:00
又是一个X-Y问题,不去解决数据库重连,反倒是想重启整个Python脚本。。
loryyang
2014-01-08 17:15:22 +08:00
@fdsfsdfsdf3334 那就在python代码里面改吧,数据库连接重试是个常见问题,肯定有很多的解决方案了的,不会花费太多精力的
loading
2014-01-08 19:03:33 +08:00
@9hills 是我不好,我没提出来,而且歪楼了…
suriv520
2014-01-08 20:21:16 +08:00
我的经验是:当你发现自己的某个设计做起来很难的时候,一定是打开方式有问题……这种情况放开思路多想想,比往牛角尖里钻要划算……

普通青年
用Supervisord这个神器护身,或者subprocess开工,或者调外部命令(Linux下的at命令你知道的吧)重启。也懒得管程序里崩出了什么错误,反正最外面有专业防泄漏直接重启进程。

2B青年
有时候不知道到底是数据层出问题了,还是应用出问题了,还是系统哪个地方死翘翘了。怎么搞?不怕!把所有的必需服务都设成开机自启动,cronjob里加检测脚本,一旦出问题,祭出reboot大杀器……

文艺青年
在DB层的connection handler里加入异常重连。重连几次仍然失败的情况下直接抛出异常,让主循环的循环体直接崩掉,sleep一段比较长的时间后再开始主循环。

砖家叫兽
这种问题简直不叫问题了……你一定还没听过DBUtil、SQLAlchemy之类的杀器吧……
fdsfsdfsdf3334
2014-01-08 22:45:48 +08:00
@suriv520 确实没听过 我去研究看看
Muninn
2014-01-08 23:03:52 +08:00
我写类似的东西,都是先连接然后捕获
要是没连接上 隔30秒重试
再不行隔1分钟
然后2分钟 4分钟
设置个最多的次数
三四行就搞定了...
vbs
2014-01-09 00:19:45 +08:00
supervisor +1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/96153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX