go - ImageMagick Go API HTTP 在 ReadImageBlob 上挂起

标签 go docker imagemagick freeze beego

我写了一个 Beego HTTP 服务器,当用户点击一个端点时:

  • 服务器从另一台服务器请求图像(例如 imgur)
  • 它读取图像的字节并将它们传递给 gographics/imagick
  • 这(应该)调整图像大小并返回结果的字节数组

实际发生的是我的 HTTP 服务器完全挂起,我什至没有进行错误处理,我在服务器的所有端点上都收到 502 错误网关。

我的代码是这样的:

func processContactImage(idx int, image []byte) ([]byte, error) {
    imagick.Initialize()
    defer imagick.Terminate()
    log.Println("idx: ", idx)
    mw := imagick.NewMagickWand()

    log.Println("reading image blob: ", image)
    err := mw.ReadImageBlob(image)
    if err != nil {
        log.Println("reading blob failed: ", err)
        return []byte{}, err
    }
//...
}

我可以在终端中看到日志消息“读取图像 blob:[字节,字节字节]”,并且我已将打印的字节复制到另一个小程序以测试字节是否确实包含图像,它们确实如此。 它完全卡在 err := mw.ReadImageBlob(image) 上,我认为它甚至没有进入 if err != nil 因为我从未看到该日志消息.

欢迎提供有关我应该如何调试它的提示。我编写了一个小程序来测试图像魔术函数在独立环境中对字节数组的工作情况,一切正常。

我的想法:

  • 我不完全理解 Go 是如何处理堆栈/堆的,我认为它可以在必要时将东西移到堆中,我不需要管理它。但是我在内存中存储图像,我想可能是 seg fault 但我不确定为什么它没有崩溃而是挂起...
  • ReadImageBlob 需要一种图像数据,但它没有得到它,尽管我当时认为它出错了

编辑:

好的,感谢您的评论,经过更多研究,这似乎与我在 Docker 中运行它有关,但没有发生这可能是一个问题:

  1. 我把imagemagick的初始化移到main里了,还是报错
  2. 当我在没有 docker 的情况下运行应用程序并将字节数组传递给处理程序时,imagemagick 代码运行良好。
  3. 当我附加到 docker 容器时,添加一个小测试程序,使用 imagemagick(但不是网络服务,只是一个二进制文件)向图像添加一个圆圈,它可以工作,尽管速度很慢

我的 dockerfile 看起来像这样:

FROM golang:1.7-alpine

RUN apk update && apk add git && apk add g++ && apk add bzr && \
    rm -rf /var/cache/apk/*

# ENV GOPATH /go

# Install beego & bee
RUN go get github.com/astaxie/beego
RUN go get github.com/beego/bee
RUN go get github.com/tools/godep

RUN apk add --update alpine-sdk
RUN apk add imagemagick-dev
RUN go get gopkg.in/gographics/imagick.v2/imagick

我想知道我是否缺少库或其他东西,它卡在 C api 中,Go 正在等待响应。有什么方法可以调试它吗?

好的...事实证明问题出在其他方面...也许是同时发出多个请求之类的...我不确定,但我已经创建了这个 gist在处理程序中演示在 Go 中使用 imagemagick,它在我的 docker 容器中本地工作没有问题。谜团还在继续……

最佳答案

不要在你的处理程序中这样做:

imagick.Initialize()
defer imagick.Terminate()

这只应该在您的 main()

中完成一次

您很可能与不同的请求发生冲突,每次请求完成时都会拆除整个 ImageMagick。

关于go - ImageMagick Go API HTTP 在 ReadImageBlob 上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644215/

相关文章:

tree - Golang 中的这段代码是惯用的吗?持久化树

linux - arm 上的 autocert 中缺少字段或方法签名方案

docker - 我的 kafka docker 容器无法连接到我的 zookeeper docker 容器

docker - 如何正确设置基本的 traefik 反向代理?

docker - 我可以使用dokku predeploy在docker容器中安装google chrome吗?

php - 如何在开罗获得更好的抗锯齿效果(所示示例)

mongodb - 如何使用自定义结构在 mongo 中进行搜索?

go - 来自 Opencensus Libraries for Golang 的 vendor 问题

image - 使用 imagemagick 中的颜色列表重新映射/分色图像颜色

node.js - 运行 ImageMagick 的 NodeJs 转换目录中的所有图像