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

Mik*_*ael 2 concurrency go goroutine

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

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

从我阅读和理解的内容来看:

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

我需要让所有线程都能流畅地执行。就像每个goroutine. 我不需要一些goroutine被执行很长时间而其他人会等待..

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

icz*_*cza 16

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

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

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

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