深入浅析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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
Python下线程之间的共享和释放示例
May 04 Python
Python如何实现守护进程的方法示例
Feb 08 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
TensorFlow 显存使用机制详解
Feb 03 Python
Python通过socketserver处理多个链接
Mar 18 Python
Python实现敏感词过滤的4种方法
Sep 12 Python
基于python的matplotlib制作双Y轴图
Apr 20 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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
超级简单的发送邮件程序
2006/10/09 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
利用php生成验证码
2017/02/23 PHP
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
python设置值及NaN值处理方法
2018/07/03 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
python随机数分布random均匀分布实例
2019/11/27 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python自动点赞功能的实现思路
2020/02/26 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
致400米运动员广播稿
2014/02/07 职场文书
家长评语和期望
2014/02/10 职场文书
环保倡议书范文
2014/05/12 职场文书
2014公司年终工作总结
2014/12/19 职场文书
前台岗位职责
2015/02/13 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
Python字典的基础操作
2021/11/01 Python
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers