一:前言
python 语言具有良好的垃圾回收功能,但是实际运用爬虫的时候还是会出现内存逐渐增大的现象,包括数据库服务占用的内存也会不断增加。这样服务器或者电脑就会收到一定的影响。这次的代码就是通过对电脑内存或者相关指标的监控,达到规定的值后就会重启爬虫程序和数据库。这个监控还有很多优化的地方,不过应对一般的需要够用了,以后再继续丰富一下功能。
二:运行环境
- python 3.6
- cmder windows下的命令行工具 可使用很多linux 的命令
- psutil 获取系统相关信息
三:监控进程的思路
主要问题:现在有个爬虫程序摆在我面前,它长时间爬着爬着爬虫程序和数据库的内存就会增大,因影响爬虫的继续和电脑或服务器的正常使用。
解决思路:
- 通过判断cpu 和内存占用率 然后决定是否要杀死爬虫程序和数据库服务进程
- win下 通过 tasklisst 命令获取到我们需要的pid 然后杀死进程
- 重启爬虫程序和数据库
- 做个时间延迟并循环判断
通过以上4个步骤的思考主要问题基本就算解决了,下面就是代码实现的过程了。
四:实战代码
import os
import psutil
import time
import sys
def start_spider():
os.popen('python spider_name')
print('start spider succeed')
def start_mongo():
os.popen('mongod --dbpath=c:\data\db')
pid = os.popen("tasklist | grep mongod | awk '{print $2}'").read()[:-1]
print('start mongod succeed')
print('mongo pid: {}'.format(pid))
def kill_spider(pid):
os.popen('taskkill /pid {} /f'.format(str(pid)))
print('kill spider over pid: {}'.format(pid))
def kill_mongo():
pid = os.popen("tasklist | grep mongod | awk '{print $2}'").read()[:-1]
if pid:
os.popen('taskkill /pid {} /f'.format(pid))
print('kill mongo over pid: {}'.format(pid))
else:
print('no mongo')
def judge_spider(spider_pid):
p = psutil.Process(spider_pid)
memory_percent = psutil.virtual_memory().percent
pid_memory_percent = p.memory_percent()
print('memory_percent: ' + str(memory_percent), 'pid_memory_percent: ' + str(pid_memory_percent))
if memory_percent > int(default_memory_percent):
kill_spider(spider_pid)
kill_mongo()
time.sleep(5)
print('restart spider and mongo')
main()
else:
time.sleep(180)
judge_spider(spider_pid)
def main():
start_mongo()
start_spider()
guardian_pwd = str(os.getpid())
pids = os.popen("tasklist | grep python | awk '{print $2}'").read()
pids = pids.split('\n')[:-1]
if guardian_pwd in pids:
pids.remove(guardian_pwd)
if not pids:
print('no pid, please start spider process')
return
spider_pid = pids[-1]
print('spider_pid: ', spider_pid)
judge_spider(int(spider_pid))
if __name__ == '__main__':
spider_name = sys.argv[1]
default_memory_percent = sys.argv[2]
main()
使用方式:python 本程序名称 爬虫名称 内存占用率
例如:python guardian.py tieba.py 80
五:总结
先这样码上,具体的说明稍后有空补上。本次代码保存在 Github中 https://github.com/rieuse/learnPython/tree/master/guardian