为了账号安全,请及时绑定邮箱和手机立即绑定

golang 好用在多线程应用程序中吗?

golang 好用在多线程应用程序中吗?

Go
幕布斯7119047 2022-05-18 14:48:19
我正在构建将创建大量线程的应用程序。每个线程将连接到不同的远程服务器,并且每个线程必须始终与它的服务器通信。在我使用之前PHP,对于这样的目标来说,这是一个不好的解决方案。我认为本机线程如何工作:例如,我们在单核上有 100 个线程。核心将在所有线程之间分配它的工作时间。根据我的阅读和理解,这里是:如果我开很多goroutines,goroutine可以阻止其他人的执行goroutines。goroutine在特定情况下(可能在当前睡眠或类似情况下),执行将被传递给其他人。但它不像本地线程那样工作。我需要使所有线程都能流畅地执行。就像每个处理器的时间一样goroutine。我不需要一些goroutine被执行很长时间而另一些会等待..我可以实现它golang吗?或者更好地使用另一种语言(哪一种)?
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

并发是 Go 的主要优势之一。这并不意味着 Go 运行时可以神奇地解决所有问题和案例,并使您的所有代码闪电般快速。你可以用任何语言编写糟糕的代码。但是并发是内置在语言中的。它为您提供了几种语言工具,意味着轻松编写高效的并发代码,例如 goroutines、channels、selectstatement、同步原语。

goroutine 是一个轻量级线程。它比真正的 OS 线程成本低很多,并且多个 goroutine 可以多路复用到单个 OS 线程上。规范将它们定义为“同一地址空间内的独立并发控制线程”

Go 运行时能够毫无问题地处理数千甚至数十万个 goroutine。例如,标准库中的HTTP 服务器通过为每个请求启动一个新的 goroutine 来处理所有传入请求。然而,对于典型的请求负载(基准源),它每秒能够处理数万个请求。

所以总而言之,不要写“坏代码”。goroutine 调度程序不是(完全)抢占式的,因此请确保您的 goroutines 不会进行会阻止调度程序运行其他 goroutines 的无意义计算。通常,系统调用、IO 操作符和阻塞操作(例如从通道发送/接收)是很好的屈服点。即使您不知道,许多代码也会在后台执行这些操作,因此大多数代码不会引起问题。如果您的某个 goroutine 必须进行大量计算,您可以随时调用runtime.Gosched()以让处理器,允许其他 goroutine 运行。


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信