ChromeDP 和高 CPU 使用率(Golang)

问题描述 投票:0回答:1

我使用

chromedp
和 Go 将 html 页面转换为图像(使用截图方法),但它使用大量 CPU。可以吗?我可以优化它吗?这是我如何使用它的(我尝试打开第一个选项卡,但一切都一样,在 .Run 方法之后,端点没有响应(应用程序正常运行,并行运行状况检查请求正常)

这里代码:

func (cdp *ChromeDP) ConvertToImage(html string) ([]byte, error) {
    var res []byte
    // You should use same context from ChromeDP struct, to avoid zombie chrome process
    ctx1, cancel1 := chromedp.NewContext(cdp.ctx)
    defer cancel1()

    var wg sync.WaitGroup
    wg.Add(1)
    if err := chromedp.Run(ctx1,
        chromedp.Navigate("about:blank"),
        chromedp.ActionFunc(func(ctx context.Context) error {
            lctx, cancel := context.WithCancel(ctx)
            chromedp.ListenTarget(lctx, func(ev interface{}) {
                if _, ok := ev.(*page.EventLoadEventFired); ok {
                    wg.Done()
                    cancel()
                }
            })

            return nil
        }),
        chromedp.ActionFunc(func(ctx context.Context) error {
            frameTree, err := page.GetFrameTree().Do(ctx)
            if err != nil {
                return err
            }

            return page.SetDocumentContent(frameTree.Frame.ID, html).Do(ctx)
        }),
        chromedp.ActionFunc(func(ctx context.Context) error {
            wg.Wait()

            return nil
        }),
        chromedp.ActionFunc(func(ctx context.Context) error {
            result, err := page.CaptureScreenshot().Do(ctx)
            if err != nil {
                return err
            }

            res = result
            return nil
        }),
    ); err != nil {
        return nil, err
    }

    return res, nil
}

(不是wg问题,已测试过:D)

docker go chromedp
1个回答
0
投票

我在使用安装了 chromium 的 alpine Docker 镜像时遇到了同样的问题。

chromedp
处理任何 chrome 实例来执行命令。

我更改了 Dockerfile 以使用 chromedp/headless-shell:

# Build
FROM golang:latest AS build

RUN mkdir /go/src/app
COPY . /go/src/app

WORKDIR /go/src/app

RUN go mod tidy
RUN go build -o /go/src/app/main main.go

# Run
FROM chromedp/headless-shell:latest

COPY --from=build /go/src/app/main /go/src/app/
COPY --from=build /go/src/app/templates /go/src/app/templates

WORKDIR /go/src/app

EXPOSE 8080

RUN apt-get update; apt install dumb-init -y

ENTRYPOINT ["dumb-init", "--"]
CMD ["/go/src/app/main"]

我将 Alpine 镜像替换为 Debian 镜像(golang:构建阶段的最新版本),因为 chromedp/headless-shell(镜像中的第二阶段)基于它。

在我的集群中,它需要 400% 的 CPU。更改后下降至 2%。

另一种方法是始终有一个正在运行的浏览器实例:第一个

chromedp.NewContext(cdp.ctx)
应打开一个
about:blank
选项卡以永远不会关闭浏览器。

© www.soinside.com 2019 - 2024. All rights reserved.