实际运用~通过信号传递的方式监控程序运行kill进程

在运用selenium调用浏览器进行自动化运行或者爬虫采集,发现了一个问题,就是浏览器在启动运行后再关闭退出,这中间有时程序突然卡顿,一直停滞不前,这其中的卡顿问题,可能是更换ip时出现偶尔性反应延迟,导致程序卡顿,如果代码运行基本没问题,想要持续运行,就需要对程序进行监控。

对于这种情况,我的一个想法就是通过信号传递的方式,获取进程pid的持续时间,从而判断selenium自动化运行时是否卡顿。首先用案例测试一下

selenium运行文件

在test2.py文件中,打开了谷歌浏览器,并获取驱动的PID,并将驱动PID通过信号发送出去,程序正常运行结束,退出浏览器,并杀死driver进程PID

import time

from selenium import webdriver
from blinker import signal
import os

class A:
    s = signal(str)
    def openChrome(self):
        self.driver = webdriver.Chrome()
        self.driverPID = self.driver.service.process.pid
        self.s.send(self.driverPID)

    def kill_pid(self,pid):
        self.driver.quit()
        os.system('taskkill /f /pid %s' % pid)

    def main(self):
        self.openChrome()
        time.sleep(3)
        # self.kill_pid(self.driverPID)

if __name__ == '__main__':
    A().main()

监控文件

在test3.py文件中,运行程序,通过信号连接,获取driver进程PID信号,并监控程序的运行状态。通过等待5分钟的时间,如果driver驱动的进程PID还是存在,说明程序卡顿了,再通过`psutil`库生成进程迭代器,并检查是否有指定driver的进程PID,然后并kill掉PID和浏览器驱动,最后再重新运行。

from test2 import A
import os
import psutil
import time
s = A().s
tid = None
@s.connect
def get_pid(tar_pid):
    global tid
    print('driver的进程pid为',tar_pid)
    tid = tar_pid

def check():
    global tid

    all_pid = psutil.process_iter()
    while True:
        try:
            pid = all_pid.__next__().pid
            if pid == tid:
                print('程序卡顿了,重新运行程序,并删除所有的chrome.exe')
                os.system('taskkill /f /pid %s' % pid)
                os.system('taskkill /f /im %s' % 'chrome.exe')
                break
        except:
            break

def run():
    A().main()
    time.sleep(60*5)
    check()


if __name__ == '__main__':
    run()

运行结果

总结:通过blinker信号传递,获取驱动进程PID,对程序运行时间进行监控,通过固定的等待时间,超过该时间,再利用`psutil'库对驱动进程PID进行检查,如果存在,则删除浏览器进程,并重新运行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值