当前位置: 首页 > 网络应用技术

您确定不滥用Goroutine吗?

时间:2023-03-06 12:44:59 网络应用技术

  学习golang,这条路仍然很长。我仍然记得,当我第一次开始学习Golang时,写作真的很简单。有很多包装和工具可以使用。

  Golang天生就很高,并且在编码时,将滥用Goroutine。让我们看看它是如何被滥用的。

  XDM查看上面的简单程序运行GO运行main.go输出?

  它会输出0到9吗?让我们看一下效果

  哦,为什么是这样,它清楚地散发了10次,结果应在每次1时打印出来。

  实际上,我们看到的这种现象属于并发错误

  我们尝试通过匿名函数传递参数i,以查看效果是否会更好

  再次执行输出

  果然,这是我们想要的结果

  然后回顾代码,我们可以发现我是主要关联中的变量。阅读i的值不断导致并发错误

  避免使用此并发症错误,您可以使用上面使用的参数副本。

  让我们确认我的地址是否一直相同

  该程序正在运行如下。主要的coroutine是相同的i,地址完全相同。

  让我们看一下解决错误时i地址之间的区别。

  我们可以看到,主关联中我地址的地址仍然相同,这是正确的,但是sub -coroutine中每个coroutine中每个coroutine的i变量地址不同。变量i,因此上面没有上述错误

  有时,当我们编码时,我们会打开多个Coroutines,但是可能会在Coroutine中感到恐慌。

  举一个简单的例子

  上面的程序很明显,令人恐慌,删除0是一个例外。可以想象,由于Sub -Coroutine的恐慌

  运行程序后,错误消息如下:

  我们将处理是否在每个子核心出口之前会出现恐慌,因此Sub -Coroutine的恐慌不会导致主要的Coroutine挂断。在这里记住

  程序运行效果如下:

  显然,该程序并非没有恐慌,因为处理了每个子库中发生的恐慌。我们还可以使用Golang提供的运行时包来打印特定的恐慌信息以促进问题的分析

  让我们写一个简单的例子

  在这里,我们使用它来计算Goroutine Panic的堆栈信息的字节数,最后打印

  让我们先看一下效果

  我们打印出恐慌堆栈信息的字节数量,并打印出恐慌的特定信息。最重要的是该程序不会崩溃

  通过使用上述方法,您可以使Sub -Coroutine的恐慌不会影响主coroutine。

  您可以看到对功能功能的解释。

  堆栈调用Goroutine的堆栈跟踪格式化为BUF,并返回写入BUF的字节数。

  如果为true,堆栈将在当前的Goroutine跟踪和输入BUF之后格式化所有其他Goroutine堆栈跟踪。

  Golang有很多技能。我们需要使用它来反映其价值。