深入浅析python定时杀进程


Posted in Python onJune 06, 2016

之前写了个python脚本用selenium+phantomjs爬新帖子,在循环拉取页面的过程中,phantomjs总是block住,使用WebDriverWait设置最长等待时间无效。用firefox替换phantomjs无改善

因为这个脚本不会长期使用,因此采取临时办法,新开一个子线程固定周期杀死phantomjs进程,这样selenium就会在block最多不超过此周期后返回。当然在爬虫脚本中做一些微调防止部分url被跳过

定时执行任务采用sched模块,很多人将其与crontab相提并论

杀死特定进程的命令

kill -9 pid命令可以无条件终止对应pid进程

获取名为phantomjs的进程pid

ps命令列出进程信息

grep过滤得指定名字的进程信息

awk '{print $2}'提取第二列pid信息

最终命令为:kill -9 `ps -aux|grep phantomjs|awk '{print $2}'`

python可以用os.system()执行shell命令

使用sched模块周期执行任务

sched模块使用heapq保存event队列,其event为namedtuple类型

sched需要提供两个函数,一个用来获取时间变化,一个用于等待一段时间,可自定义

基本API

sched.scheduler(time_func, sleep_func) 函数返回一个scheduler对象,timefunc是一个返回数字的计时函数,而sleepfunc可接受此数字参数,并延时相应时间

scheduler.enter(delay, priority, action, argument)在delay时间段后,用参数argument调用action, argument必须是一个tuple。若要在固定时刻运行,则应调用scheduler.enterabs

scheduler.cancel(event)取消定时任务。event为enter函数返回值

scheduler.run()开始执行

任务时间重叠

在执行任务时有可能要block一段时间,任务返回后可能已经超过下一个任务的定时时刻,这种情况下会立刻执行下一个任务,而不会跳过

周期执行

类似于递归调用,写一个wrapper function,在任务里面再次定时下一次任务即可

def wrapper(func, delay):
scheduler.enter(delay, 0, wrapper, (func, delay))
func()

最终代码

import os, time, sched
schedule = sched.scheduler(time.time, time.sleep)
cmd = '''kill -9 `ps -aux|grep phantomjs|awk '{print $2}'`
'''
def recycle_eval(c, inc):
schedule.enter(inc, 0, recycle_eval, (c, inc))
os.system(c)
print time.ctime(),'phantomjs killed'
if __name__ == '__main__':
inc = 180
schedule.enter(inc, 0, recycle_eval, (cmd, inc))
schedule.run()

以上所述是小编给大家介绍的python定时杀进程的相关知识,希望能够帮助到大家!

Python 相关文章推荐
python抓取网页时字符集转换问题处理方案分享
Jun 19 Python
用Python中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
python实现发送邮件功能
Jul 22 Python
Python之web模板应用
Dec 26 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
pywinauto自动化操作记事本
Aug 26 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
深入理解python函数递归和生成器
Jun 06 #Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 #Python
浅析AST抽象语法树及Python代码实现
Jun 06 #Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 #Python
在Python的Flask框架中构建Web表单的教程
Jun 04 #Python
Python中规范定义命名空间的一些建议
Jun 04 #Python
全面理解Python中self的用法
Jun 04 #Python
You might like
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
PHP中16个高危函数整理
2019/09/19 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
DOM 中的事件处理介绍
2012/01/18 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
javascript每日必学之循环
2016/02/19 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
python中pass语句用法实例分析
2015/04/30 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
财务会计专业应届毕业生求职信
2013/10/18 职场文书
学习两会精神心得范文
2014/03/17 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
校车司机安全责任书
2015/05/11 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js