我写了一个 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 中运行它有关,但没有发生这可能是一个问题:
- 我把imagemagick的初始化移到main里了,还是报错
- 当我在没有 docker 的情况下运行应用程序并将字节数组传递给处理程序时,imagemagick 代码运行良好。
- 当我附加到 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/