【发布时间】: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