【问题标题】:Golang error function arguments too large for new goroutineGolang 错误函数参数对于新的 goroutine 来说太大了
【发布时间】:2020-11-04 20:15:37
【问题描述】:

我正在运行一个带有 go 1.4 的程序,并且我正在尝试将一个大型结构传递给一个 go 函数。

go ProcessImpression(network, &logImpression, campaign, actualSpent, partnerAccount, deviceId, otherParams)

我收到此错误:

runtime.newproc: function arguments too large for new goroutine

我已经转向通过引用传递,这有帮助,但我想知道是否有某种方法可以在 go 函数中传递大型结构。

谢谢,

【问题讨论】:

  • 注意:Go 中绝对没有“按引用传递”的概念。你按值传递指针。

标签: go


【解决方案1】:

没有,我不知道。

我认为你不应该过于激进地调整以避免复制,但似乎from the source 当参数超过新 goroutine 的可用堆栈空间时会发出此错误,这应该是千字节。那时复制开销是真实的,特别是如果这不是唯一一次复制这些东西的话。由于大型结构成员(例如,1kb 数组而不是切片)或间接地,某些结构可能显式大于预期。如果没有,只使用一个指针是有意义的,如果你担心创建垃圾,回收使用sync.Pool 指向的结构。

【讨论】:

    【解决方案2】:

    我可以通过更改参数来解决这个问题

    func doStuff(prev, next User)
    

    func doStuff(prev, next *User)
    

    @twotwotwo in here 的回答非常有帮助。

    【讨论】:

      【解决方案3】:

      在处理大结构的值列表([]BigType)时遇到此问题:

      for _, stct := range listBigStcts {
          go func(stct BigType) {
              ...process stct ...
          }(stct) // <-- error occurs here
      
      }
      

      解决方法是将[]BigType 替换为[]*BigType

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多