我正在尝试在服务器端环境中在一秒钟内生成网页图像。这些请求可以同时来自网络。为此,我正在使用运行良好的 Puppeteer-Sharp库。在后端,它使用 Chromium 加载页面,然后对其进行截图。
问题是需要一段时间才能开始。例如,请注意 readme.md 示例代码中的时间(来自我的电脑):
var options = new new LaunchOptions {Headless = true, ExecutablePath = @"c:\foo\chrome.exe"};
var browser = await Puppeteer.LaunchAsync(options).Result; // ~500ms
var page = browser.NewPageAsync().Result; // ~215ms
var webPage = page.GoToAsync("http://www.google.com").Result; // ~500ms
var screenshot = page.ScreenshotAsync(outputFile);
screenshot.wait(); // ~300ms
如您所见,它很容易超过一秒钟。我不知道 Chromium 在内部是如何工作的,所以我有几个与我正在考虑的解决方案有关的问题。
- 对象是
PuppeteerSharp.Browser
线程安全的和/或可重入的吗?我可以使用来自不同线程的相同浏览器对象吗?我不这么认为,因为它与内存中的特定 Chromium 实例相关联。 - 如果我从每个请求中删除
.LaunchAsync
,.NetPageAsync
这将显着加快操作。对象池会PuppeteerSharp.Browser
起作用吗?例如,我可以预先分配其中的 5 个并.NetPageAsync
在它们上执行。然后传入的请求将使用池中的对象。这是一个可行的方法吗?