Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理

本文主要是介绍Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Execution context was destroyed产生的场景

在NodeJs中使用Puppeteer中Page对象的evaluate方法执行脚本,深入使用后一定遇到过Error: Execution context was destroyed 错误。这通常发生在浏览器正在执行一个任务,紧接使用方并发提交了另一个脚本到浏览器,导致浏览器发生跳转。这时第一次提交的任务会抛出异常,产生该错误。

Execution context was destroyed 错误的解决

分析原因后可知问题在于调用方并发提交任务速度过快,而单独的一个浏览器对象执行脚本的QPS过低,导致出现该问题。那么此时可以通过多个打开过个Page对象(browser.newPage())来完成多任务执行,以避免产生该错误。而多个page对象的管理就需要用到对象池。 可以考虑使用node.js中流行的对象池工具generic-pool[1]

pagePool.use(async (page)=>  {return await page.evaluate(page);});

在创建对象池时,对象数量需要根据实际业务情况来设置。比如实际业务需要执行脚本,执行时间期望小于500ms,那么为了达到6qs,则只要需要3个page对象(即三个浏览器窗口)。

为了保证任务执行时间限制在500ms内,执还需要进行超时判断。这时利用Promise.race方法来间接实现page.evaluate方法超时功能。

Promise.race([page.evaluate(data),page.waitFor(timeout)]);

最后在执行完一段脚本后,需要重新初始浏览器窗口环境,防止有定时任务之类的未知脚本一直执行占用资源,最终导致系统CPU利用率持续升高,无法正常使用。通过跳转到空白页即可实现。

page.goto("about:blank");

经过上述三步改造后最终可实现一个高效可用的evaluate方法,并保证提交的任务正常执行。如果单机无法满足条件,水平扩展机器即可。

参考

[1].generic-pool文档,https://www.npmjs.com/package/generic-pool

这篇关于Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2943

相关文章

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

python 3.8 的anaconda下载方法

《python3.8的anaconda下载方法》本文详细介绍了如何下载和安装带有Python3.8的Anaconda发行版,包括Anaconda简介、下载步骤、安装指南以及验证安装结果,此外,还介... 目录python3.8 版本的 Anaconda 下载与安装指南一、Anaconda 简介二、下载 An

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数