草庐IT

go - ImageMagick Go API HTTP 在 ReadImageBlob 上挂起

coder 2024-07-06 原文

我写了一个 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/

有关go - ImageMagick Go API HTTP 在 ReadImageBlob 上挂起的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby - Net::SSH sudo 命令在输入密码后挂起 - 2

    我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为

  3. ruby - 如何禁止在 RSpec 中显示挂起(跳过)的规范? - 2

    我有几个跳过的规范。Pending:(Failureslistedhereareexpectedanddonotaffectyoursuite'sstatus)1)...#Notyetimplemented#./spec/requests/request_spec.rb:22如何抑制未决规范的输出? 最佳答案 您可以添加以下配置选项以从运行中过滤掉所有待处理的规范:RSpec.configuredo|config|config.filter_run_excludingskip:trueend此外,here是一个更详细的抑制输出的建议

  4. ruby-on-rails - Rails 和 Rake 命令挂起并且什么都不做 - 2

    我不知道为什么,但是当我在我的Rails项目中运行rake命令时,没有任何反应。railsserver什么也不做。有什么建议吗? 最佳答案 你可以在开头添加一个“ruby-rtracer”以查看它卡在哪里。 关于ruby-on-rails-Rails和Rake命令挂起并且什么都不做,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3657296/

  5. ruby-on-rails - 即使没有挂起的迁移,Rails 迁移也非常缓慢 - 2

    我的生产Rails应用程序需要167秒来运行rakedb:migrate。可悲的是,没有要运行的迁移。我试图在检查是否有待处理的迁移时调整运行的迁移,但随后检查花费了同样长的时间。我心目中唯一的“借口”是数据库并不小,那里有1M条记录,但我看不出这有什么关系。我查看了日志,但没有任何迹象表明出了什么问题。我在运行ruby2.2.0rails4.2.0有没有人知道为什么会这样,是否有什么办法可以解决? 最佳答案 运行rakedb:migrate任务还会调用db:schema:dump任务,这将更新您的db/schema.rb。因此,即

  6. ruby - 具有基本身份验证和 gzip 的 em-http 流挂起 - 2

    我正在尝试使用GnipPowerTrackAPI,这需要我使用基本身份验证连接到JSON的HTTPS流。我觉得这应该是相当微不足道的,所以我希望一些比我聪明的ruby​​ist可以指出我明显的错误。这是我的ruby​​1.9.3代码的相关部分:require'eventmachine'require'em-http'require'json'usage="#{$0}"abortusageunlessuser=ARGV.shiftabortusageunlesspassword=ARGV.shiftGNIP_STREAMING_URL='https://stream.gnip.com:4

  7. ruby - 减少挂起 Sinatra 应用程序 - 2

    我正在尝试将Bootstrap添加到Sinatra应用程序中。我已经设置了编译路径bootstrap.less和responsive.less.在Web浏览器中分别加载两个样式表会按预期工作。但是当我尝试在html页面中使用它们时,我的应用程序挂起。我只能用kill-9停止应用程序.似乎Lessimports和multiplestylesheets以某种方式导致应用程序挂起。我能够隔离问题:app.rbrequire'rubygems'require'bundler/setup'require'sinatra'require'less'get'/'dohaml:indexendget'

  8. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  9. ruby-on-rails - "rails generate model"挂起 - 2

    我是ROR的新手。如何在删除我的Rails应用程序后使用相同的应用程序名称?以下是我执行的操作。第6步是我的问题。1-环境-OS:Ubuntu12.04.4-ruby:2.1.1p76-rails:4.1.2-DB:SQLite2-创建rails应用程序:railsnewmyApp=>OK3-创建模型:railsgeneratemodelmytablename:string=>OK.4-删除rails应用程序:rm-rfmyApp=>OK5-重新创建rails应用程序:railsnewmyApp=>OK6-重新创建模型:railsgeneratemodelmytablename:str

  10. ruby-on-rails - Rails 上的 ruby : How to have multiple submit buttons going to different methods (maybe with with_action? ) - 2

    这个问题在这里已经有了答案:HowdoIcreatemultiplesubmitbuttonsforthesameforminRails?(7个答案)关闭9年前。所以..'save'%>'library'%>然后在我的Controller中:with_actiondo|a|a.savedoenda.librarydoendend问题是只有一个操作被调用...两个submit_tags调用相同的操作...知道为什么吗?或者我如何获得两个按钮以将表单提交给两种不同的方法?

随机推荐