C# 如何在高性能环境中生成网页图像?

C# 如何在高性能环境中生成网页图像?,c#,.net,chromium,webautomation,puppeteer-sharp,C#,.net,Chromium,Webautomation,Puppeteer Sharp,我试图在服务器端环境中在不到一秒钟的时间内生成网页的图像。这些请求可以同时来自网络。为此,我使用了一个运行良好的库。在后端,它使用Chromium加载页面,然后截屏 问题是要花一段时间才能开始。例如,请注意readme.md示例代码中的计时(从我的电脑): var options = new new LaunchOptions {Headless = true, ExecutablePath = @"c:\foo\chrome.exe"}; var browser = await Puppete

我试图在服务器端环境中在不到一秒钟的时间内生成网页的图像。这些请求可以同时来自网络。为此,我使用了一个运行良好的库。在后端,它使用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   
正如你所看到的,它很容易就超过一秒钟。我不知道铬在内部是如何工作的,所以我有几个问题与我正在考虑的解决方案有关

  • PuppeterSharp.Browser对象线程是否安全和/或可重入?我可以从不同的线程使用相同的浏览器对象吗?我不这么认为,因为它与内存中铬的一个特定实例有关
  • 如果我从每个请求中删除
    .LaunchAsync
    .NetPageAsync
    ,将显著加快操作速度。
    puppetersharp.Browser
    对象池可以工作吗?例如,我可以预先分配其中的5个,并对它们执行
    .NetPageAsync
    。然后传入的请求将使用池中的对象。这是一个可行的方法吗
  • 虽然仍然有,木偶演员夏普是线程安全。要提高加载性能,可以采取以下几种方法

    启动一个浏览器,然后连接到它

    您可以启动一个(真实)浏览器,然后使用
    ConnectAsync
    方法连接到它

    wait new BrowserFetcher().downloadsync(BrowserFetcher.DefaultRevision);
    var browser=await puppeter.LaunchAsync(新的启动选项
    {
    无头=假,
    });
    var theBrowser1=wait puppeter.ConnectAsync(新的ConnectOptions{BrowserWSEndpoint=browser.WebSocketEndpoint});
    var theBrowser2=await puppeter.ConnectAsync(新的ConnectOptions{BrowserWSEndpoint=browser.WebSocketEndpoint});
    var page1=等待浏览器1.NewPageAsync();
    var page2=等待浏览器2.NewPageAsync();
    等待任务(
    第1页GoToAsync(“https://www.stackoverflow.com"),
    第2页GoToAsync(“https://serverfault.com/")
    );
    
    我知道代码不是并行运行的,但您会想到重用同一个浏览器

    在同一浏览器上创建新页面

    如果您正在使用,那么使用同一浏览器从不同线程创建新页面时应该不会出现任何问题

    wait new BrowserFetcher().downloadsync(BrowserFetcher.DefaultRevision);
    var browser=await puppeter.LaunchAsync(新的启动选项
    {
    无头=假,
    });
    var url=新字符串[]
    {
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com",
    "https://www.stackoverflow.com"
    };
    等待任务(
    url.Select(url=>Task.Factory.StartNew(async()=>
    {
    var page=await browser.NewPageAsync();
    返回页面.GoToAsync(url);
    })));
    
    同样,这个例子只是想让您了解如何实现这一点

    页面队列

    有一个用户创建了一个包含X个页面的队列(对于X,从0到X=>NewPage),然后他将从该队列中获取页面。你可以看到这张照片