c#爬虫-从内存中释放Selenium chromedriver.exe终极杀
背景
之前在做爬虫的时候,遇到内存释放不掉的问题,从内存中释放Selenium chromedriver.exe。后面我使用以下方法:
public override void DoJob(IJobExecutionConxt context, ILifetimeScope scope, string[] args){Console.WriteLine(nameof(LoginReptiles1688Job) + " 开始-------------------");ChromeOptions options = null;IWebDriver driver = null;try{。。。。。。。。。。。。。。。。。。。。。。。}catch (Exception ex){throw ex;}finally{driver?.Close(); // Close the chrome windowdriver?.Quit(); // Close the console app that was used to kick off the chrome windowdriver?.Dispose(); // Close the chromedriver.exedriver = null;options = null;detailtry = 0;shoptry = 0;Console.WriteLine(nameof(LoginReptiles1688Job) + " 结束-------------------");}}
这不,还真降下来了;但是,没等几天服务器又报警了,还是老问题,后面捣鼓了半天,还是没有解决问题。
问题窥探
其实问题的根本原因是Selenium chromedriver.exe没法正常关闭,虽然尝试了很多方法,但是始终没法测底解决;后面灵机一闪,何不来个彻底点的,使用kill把整个chromedriver.exe线程干掉,这不就彻底了;说干就干。
主要代码
[]private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);[]public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);public const int SW_HIDE = 0;public const int SW_SHOW = 5;[]public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);/// <summary>/// 获取窗口句柄/// </summary>/// <returns></returns>public IntPtr GetWindowHandle(){string name = (Environment.CurrentDirectory + "\\chromedriver.exe");IntPtr hwd = FindWindow(null, name);return hwd;}/// <summary>/// 关闭chromedriver窗口/// </summary>public void CloseWindow(){try{IntPtr hwd = GetWindowHandle();SendMessage(hwd, 0x10, 0, 0);}catch { }}/// <summary>/// 退出chromedriver/// </summary>/// <param name="driver"></param>public void CloseChromeDriver(IWebDriver driver){try{driver.Quit();driver.Dispose();}catch { }CloseWindow();}
总结
1、果然够彻底的,chromedriver.exe每次都正常关闭了,内存占用也正常。
2、事有两面性,有时候反方向来解决问题未尝不是一个好的办法。
3、使用这种方式,等于kill掉整个进程,所以不适合多个线程操作,否则会出 现中断的情况。
