深入浅析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装饰器使用示例及实际应用例子
Mar 06 Python
Python列表生成器的循环技巧分享
Mar 06 Python
python结合opencv实现人脸检测与跟踪
Jun 08 Python
Python遍历numpy数组的实例
Apr 04 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
提升Python效率之使用循环机制代替递归函数
Jul 23 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
python如何运行js语句
Sep 09 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
随机广告显示(PHP函数)
2006/10/09 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
Python中unittest用法实例
2014/09/25 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python解析xml简单示例
2019/06/21 Python
sklearn的predict_proba使用说明
2020/06/28 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
How TDD works
2012/09/30 面试题
追悼会子女答谢词
2014/01/28 职场文书
兽医医药专业求职信
2014/07/27 职场文书
个人委托书如何写
2014/09/25 职场文书
薪资证明范本
2015/06/19 职场文书
班主任工作总结范文
2015/08/13 职场文书
python 三边测量定位的实现代码
2021/04/22 Python