微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java-如何从CSV读取行以在多个线程中使用

假设我有一个包含数百行的CSV文件,其中有两个随机关键字作为我要Google搜索的单元格,并且第一个结果在页面上打印到控制台或存储在某个数组中.在此示例的情况下,我想我可以使用以下类似的方法一次成功地读取一行:

CSVReader reader = new CSVReader(new FileReader(FILE_PATH));
String [] nextLine;
while ((nextLine = reader.readNext())) !=null) {
driver.get("http://google.com/");
driver.findElement(By.name("q").click();
driver.findElement(By.name("q").clear();
driver.findElement(By.name("q").sendKeys(nextLine[0] + " " + nextLine[1]);
System.out.println(driver.findElement(By.xpath(XPATH_TO_1ST));
}

我如何通过硒处理5个或多个线程的chromedriver,以便尽快处理CSV文件?我能够一次在执行Runnable的类上执行5条线并启动5个线程,但是我想知道是否存在一种解决方案,即一旦一个线程完成,它将处理下一个线程可用或未处理的行,而不是等待5个搜索处理,然后继续进行下5行.将不胜感激任何建议的阅读或破解的提示

解决方法:

如果要同时执行5个(或更多)线程,则需要启动5个WebDriver实例,因为它不是线程安全的.至于更新CSV,您需要将每个线程的写入同步化,以防止损坏文件本身,或者您可以按一定阈值批量更新,并一次写入多行.

看到这个Can Selenium use multi threading in one browser?

更新:

这个怎么样?这样可以确保在线程之间不重复使用Web驱动程序.

CSVReader reader = new CSVReader(new FileReader(FILE_PATH));

// number to do at same time
int concurrencyCount = 5;
ExecutorService executorService = Executors.newFixedThreadPool(concurrencyCount);
CompletionService<Boolean> completionService = new ExecutorCompletionService<Boolean>(executorService);
String[] nextLine;

// ensure we use a distinct WebDriver instance per thread
final LinkedBlockingQueue<WebDriver> webDrivers = new LinkedBlockingQueue<WebDriver>();
for (int i=0; i<concurrencyCount; i++) {
    webDrivers.offer(new ChromeDriver());
}
int count = 0;
while ((nextLine = reader.readNext()) != null) {
    final String [] line = nextLine;
    completionService.submit(new Callable<Boolean>() {
        public Boolean call() {
            try {
                // take a webdriver from the queue to use
                final WebDriver driver = webDrivers.take();
                driver.get("http://google.com/");
                driver.findElement(By.name("q")).click();
                driver.findElement(By.name("q")).clear();
                driver.findElement(By.name("q")).sendKeys(line[0] + " " + line[1]);
                System.out.println(line[1]);
                line[2] = driver.findElement(By.xpath(XPATH_TO_1ST)).getText();

                // put webdriver back on the queue
                webDrivers.offer(driver);
                return true;
            } catch (InterruptedException e) {
                e.printstacktrace();
                return false;
            }
        }
    });
    count++;
}

boolean errors = false;
while(count-- > 0) {
    Future<Boolean> resultFuture = completionService.take();
    try {
        Boolean result = resultFuture.get();
    } catch(Exception e) {
        e.printstacktrace();
        errors = true;
    }
}
System.out.println("done, errors=" + errors);
for (WebDriver webDriver : webDrivers) {
    webDriver.close();
}
executorService.shutdown();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐