简单的Selenium访问控制线程池
来源:互联网 发布:linux 开机自启动脚本 编辑:程序博客网 时间:2024/06/06 00:54
思路:频繁开关phantomJS进程比较耗费资源,所以需要维护一个线程池控制访问以减少内存消耗
1. 自定义操作CustomAction接口
public interface CustomAction { String action(WebDriver webDriver);}
2. WebDriverPool池
public class WebDriverPool { // 线程池大小 private static final int MAX_COUNT = 15; // 线程数量控制 private Semaphore semaphore = new Semaphore(MAX_COUNT); // webDriver池 private WebDriver[] webDrivers = new WebDriver[MAX_COUNT]; private boolean[] driverFlag = new boolean[MAX_COUNT]; private Lock lockDrivers = new ReentrantLock(); //phantomjs路径 private final String JS_BIN = "f:/phantomjs"; public WebDriverPool() { System.setProperty("phantomjs.binary.path", JS_BIN); for (int i = 0; i < MAX_COUNT; i++) { driverFlag[i] = true; } // 关闭所有打开的浏览器 Runtime.getRuntime().addShutdownHook(new Thread(() -> { for (WebDriver webDriver : webDrivers) { if (webDriver != null) { webDriver.quit(); } } })); } /** * 生成一个新的PhantomJSDriver */ private WebDriver defaultDriver() { DesiredCapabilities cap = DesiredCapabilities.phantomjs(); // 优化命令行参数 List<String> cmdList = new ArrayList<>(); // 禁用图片 cmdList.add("--load-images=false"); // 本地缓存 cmdList.add("--disk-cache=true"); cap.setCapability("phantomjs.cli.args", cmdList); return new PhantomJSDriver(cap); } /** * 获取当前空闲的driver的下标 * * @return 当前空闲的driver的下标 */ private int freeDriverIndex() { int ret = -1; try { lockDrivers.lock(); for (int i = 0; i < driverFlag.length; i++) { if (driverFlag[i]) { driverFlag[i] = false; ret = i; break; } } if (ret != -1) { if (webDrivers[ret] == null) { webDrivers[ret] = defaultDriver(); } } } finally { lockDrivers.unlock(); } return ret; } /** * 获取执行js之后的页面html */ public String customJs(CustomAction action) { String html = ""; try { semaphore.acquire(); int index = freeDriverIndex(); //调用自定义的操作 html = action.action(webDrivers[index]); driverFlag[index] = true; } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } return html; }}
缺点:
1.不能在运行时自由伸缩线程池中的资源,也就是不能在闲时销毁池中的资源减少内存消耗 ,运行时不能很好地伸缩
2.每个PhantomJS进程只运行了一个窗口,比较浪费,可以通过PhantomJSDriverService结合RemoteWebDriver的方式支持更高的并发
3.考虑使用apache commons pool2实现
0 0
- 简单的Selenium访问控制线程池
- 线程访问控制
- 简单的基于角色的访问控制
- 一种简单线程并发控制的实现
- 一个简单的线程池工具类——可以实现对单个线程的控制
- selenium的简单实用
- selenium页面控制的问题
- 控制并发访问的线程数 Semaphore 信号灯
- Java中怎么控制线程访问资源的数量
- 多线程Demo-Semaphore 控制同时访问资源的线程个数
- 线程池中线程的控制
- Tcp_Wrapper_简单的基于主机的访问控制工具
- 简单阐述java访问控制
- 简单的线程池
- 简单的线程池
- 简单的线程池
- 简单的线程池
- 简单的线程池
- Android中Textview显示带html文本三-------【Textview显示网络图片】
- BZOJ 1066 [SCOI2007]蜥蜴
- CentOS下安装Hive2.1.0详解
- 不能被工程师群殴(二)
- Wireshark入门与进阶系列十二之IP冲突
- 简单的Selenium访问控制线程池
- MySQL字符问题
- Android4.2中全屏或者取消标题栏的方法总结
- OJ 2754 八皇后
- Codeforces 148D Bag of mice 简单概率dp
- 【JSON】JSON初了解
- Java中变量的种类、变量的初始值
- car (CF 581E)
- 统计Txt中数字个数 并存入链表