猿问

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

我正在构建将创建大量线程的应用程序。每个线程将连接到不同的远程服务器,并且每个线程必须始终与它的服务器通信。

在我使用之前PHP,对于这样的目标来说,这是一个不好的解决方案。我认为本机线程如何工作:例如,我们在单核上有 100 个线程。核心将在所有线程之间分配它的工作时间。

根据我的阅读和理解,这里是:

如果我开很多goroutinesgoroutine可以阻止其他人的执行goroutinesgoroutine在特定情况下(可能在当前睡眠或类似情况下),执行将被传递给其他人。但它不像本地线程那样工作。

我需要使所有线程都能流畅地执行。就像每个处理器的时间一样goroutine。我不需要一些goroutine被执行很长时间而另一些会等待..

我可以实现它golang吗?或者更好地使用另一种语言(哪一种)?


幕布斯7119047
浏览 118回答 1
1回答

暮色呼如

并发是 Go 的主要优势之一。这并不意味着 Go 运行时可以神奇地解决所有问题和案例,并使您的所有代码闪电般快速。你可以用任何语言编写糟糕的代码。但是并发是内置在语言中的。它为您提供了几种语言工具,意味着轻松编写高效的并发代码,例如 goroutines、channels、selectstatement、同步原语。goroutine 是一个轻量级线程。它比真正的 OS 线程成本低很多,并且多个 goroutine 可以多路复用到单个 OS 线程上。规范将它们定义为“同一地址空间内的独立并发控制线程”。Go 运行时能够毫无问题地处理数千甚至数十万个 goroutine。例如,标准库中的HTTP 服务器通过为每个请求启动一个新的 goroutine 来处理所有传入请求。然而,对于典型的请求负载(基准源),它每秒能够处理数万个请求。所以总而言之,不要写“坏代码”。goroutine 调度程序不是(完全)抢占式的,因此请确保您的 goroutines 不会进行会阻止调度程序运行其他 goroutines 的无意义计算。通常,系统调用、IO 操作符和阻塞操作(例如从通道发送/接收)是很好的屈服点。即使您不知道,许多代码也会在后台执行这些操作,因此大多数代码不会引起问题。如果您的某个 goroutine 必须进行大量计算,您可以随时调用runtime.Gosched()以让处理器,允许其他 goroutine 运行。
随时随地看视频慕课网APP

相关分类

Go
我要回答