深入浅析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编写一个图片主色转换的脚本
Dec 07 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
Python数据集切分实例
Dec 08 Python
Python玩转Excel的读写改实例
Feb 22 Python
Python基础之高级变量类型实例详解
Jan 03 Python
python字符串判断密码强弱
Mar 18 Python
Python爬虫制作翻译程序的示例代码
Feb 22 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php中神奇的fastcgi_finish_request
2011/05/02 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
python2和python3哪个使用率高
2020/06/23 Python
Django自带的用户验证系统实现
2020/12/18 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
会计专业个人自我鉴定
2014/03/21 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
公司委托书格式范文
2014/10/09 职场文书
表扬信范文
2015/05/04 职场文书