创建切片字节goroutine挂起

创建切片字节goroutine挂起,go,Go,我有一个上传程序,我正在工作,我遇到了一个问题。我有n个go例程来处理将部件上传到一个大文件的过程。基本上,它会将文件分割成100MB的块,并根据您在配置中指定的并发进程数量并发上载它们 我遇到的问题是,当我创建一个缓冲区来读取文件并上传make([]字节,100000000)挂起时。。。但前提是它是按常规进行的。(我使用100000000简化上传计算) 这里有一个例子 这项工作: 这并不是: 它只是挂着。。。我不确定围棋程序是否有内存限制?我试着研究,看看能找到什么,但什么也找不到。如有任何想

我有一个上传程序,我正在工作,我遇到了一个问题。我有n个go例程来处理将部件上传到一个大文件的过程。基本上,它会将文件分割成100MB的块,并根据您在配置中指定的并发进程数量并发上载它们

我遇到的问题是,当我创建一个缓冲区来读取文件并上传make([]字节,100000000)挂起时。。。但前提是它是按常规进行的。(我使用100000000简化上传计算)

这里有一个例子

这项工作:

这并不是:

它只是挂着。。。我不确定围棋程序是否有内存限制?我试着研究,看看能找到什么,但什么也找不到。如有任何想法,将不胜感激


编辑:谢谢大家的反馈。我会说我没有很好地解释真正的问题,下次我会尝试提供更多的整体观点。我最终使用了一个通道来阻止,以使我的goroutines为处理新文件做好准备。这适用于将DR备份上载到第三方,所有这些都需要将大型文件拆分为100mb的数据块。我想我应该更清楚我的程序的性质。

这个程序挂起,因为代码中有一个无限循环。试着像这样运行代码,向自己证明这一点。导致绞刑的不是戈罗廷

func main() {
    for {
    }
}
如果您只想查看
fmt.Println(..)
print,那么我建议您打个电话或类似的服务

如果您想等待一系列goroutine的完成,那么我建议您回答这个问题

Gosched生成处理器,允许其他goroutine运行。信息技术 不挂起当前goroutine,因此继续执行 自动地


当你做了一些奇怪的事情({}和
100MB
)时,你会得到奇怪的结果。做一些合理的事情。比如说,

package main

import (
    "fmt"
    "runtime"
)

func main() {
    go createBuffer()
    for {
        runtime.Gosched()
    }
}

func createBuffer() {
    buffer := make([]byte, 100000000)
    fmt.Println(len(buffer))
}
输出:

100000000
^Csignal: interrupt

您的程序中有一个忙循环。没有理由使用空循环。它只是无缘无故地消耗了100%的cpu,最终会阻塞运行时。请尝试使用
select{}
而不是
for{}
。这不是最好的方法(您应该使用通道来检查go例程何时完成),但出于测试目的是可以的。在goroutine中分配一个字节片是可以的,正如您在这里看到的,您的示例中的问题,正如JimB已经指出的,是for循环。我将for{}作为妖魔化goroutine的示例。我基本上有处理文件的Goroutine,我需要一种方法来将它们妖魔化。我有几个正在运行的go例程正在处理文件,其中几个使用配置来确定并发进程。问题是我需要将一个文件切成100MB的卡盘,通过http post发送,所以100MB并不奇怪。就for循环而言,这个问题消失了,现在我知道了原因,当我添加频道以返回完成的文件时。@MattA:你的例子很做作。你的现实情况不同。此外,使用每个区块100MB内存并发发送100MB区块是低效的。支持10000个用户需要多少内存?你需要一个更好的策略。谷歌使用Go内部下载:我同意,我应该更明确地说明确切的问题以及我为什么这么做。我更好奇它背后的原因,现在我看到了答案,这是有道理的。实际上,我需要一个阻塞的通道,让我们继续goroutines直到出现错误。就低效率而言,这是一个向灾难恢复备份提供商上传的实用程序,因此没有用户。您可以在配置文件中定义最大并发进程数,这是内存消耗的限制。DR api要求将大文件分成块,并在帖子正文中发送。我有一些处理文件的goroutines,它们需要保持打开状态并继续保持打开状态。我遇到的问题是将应用程序作为一个守护进程运行,这就是引发这个问题的原因。如果您想创建一个守护进程,看起来是一个很好的开始。主要的问题是你不必有一个繁忙的等待循环,这样你就不会浪费CPU周期。
import "runtime"
func Gosched()
package main

import (
    "fmt"
    "runtime"
)

func main() {
    go createBuffer()
    for {
        runtime.Gosched()
    }
}

func createBuffer() {
    buffer := make([]byte, 100000000)
    fmt.Println(len(buffer))
}
100000000
^Csignal: interrupt