【问题标题】:Is golang good to use in multithreaded application? [closed]golang 好用在多线程应用程序中吗? [关闭]
【发布时间】:2020-02-26 14:27:49
【问题描述】:

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

在我使用PHP 之前,这是一个糟糕的解决方案。 我的观点原生线程是如何工作的: 例如,我们在单核上有 100 个线程。并且核心将在所有线程之间分配它的工作时间。

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

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

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

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

【问题讨论】:

  • Goroutines 被分配给线程。如果一个 goroutine 不执行任何 i/o 或与其他 goroutine 通信,它可能不会屈服。因此,如果您的 goroutine 不是紧密循环,那么成千上万的 goroutine 可以在没有明显阻塞的情况下存在。
  • 作为一个过去做了很多 PHP,现在使用 go 作为主要语言的人,我可以根据我的经验告诉你,golang 是一个很好的选择。学习语法非常快,并且允许您编写快速工作的东西。它有一些更细致入微的功能,一开始会让你绊倒,但这是意料之中的。使用并发(而不是并行!)来提高性能的底线将意味着您必须使用go test -bench + profile 代码来找到最佳位置。在例行程序中做所有事情可能不如批处理等快......
  • 我参加了一次演讲,其中 Dave Cheney 依次运行 this mandelbrot 示例,然后使用每个像素的例程对其进行分析,最后是每行的例程。后者是最快的选择。您可能可以在网上找到演示文稿,这是了解 golang 工具链的好方法
  • @EliasVanOotegem,我是否理解正确,只有多核才能实现真正的并行性(当同时执行多个进程或线程时)?如果我们有 8 个内核 - 这意味着只有 8 个线程可以真正并行执行。
  • @Mikael 没有直接关联。您可能拥有比核心更多的线程。见Number of threads used by Go runtime

标签: go concurrency goroutine


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果goroutine与ssh或smtp服务器进行通信,是i/o操作吗?它会阻塞其他 goroutine 吗?
  • @Mikael 在网络连接上发送/接收数据是 IO 操作。它不会阻塞其他 goroutine。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多