2

我想知道多线程究竟是如何解决可伸缩性问题的。我的基本理解是当请求进入时,分配一个新线程来处理请求。但是幕后究竟发生了什么。

我目前正在启动一个项目,我必须构建一个存储云来处理 1000 次 GET、PUT、DELETE 操作。多线程会解决可扩展性问题,还是应该研究事件服务器?

4

4 回答 4

6

多线程允许一次运行多个线程。在多核机器上,这意味着两个线程可以真正并行运行,其工作量是一次运行一个线程的两倍。理想情况下,在具有 4 个线程的 4 核机器上,您完成的工作量几乎是单线程的 4 倍。

为此,您需要一个可以通过多个线程独立运行来解决的问题。您需要相当聪明才能弄清楚如何将程序分解为线程。而且,大多数时候,您需要非常聪明地防止这些线程破坏彼此的数据(或者更糟糕的是,巧妙地破坏它)。虽然有时可以几乎独立地运行线程,就像同一程序的不同会话一样,如果你能做到这一点,那就太好了。

多线程可以扩展,您可以使所有内核工作。在 4 核机器上,您完成的工作量是 4 倍——希望如此。如果你升级到 16 核机器,你会得到另外 4 倍的增长——如果你做了一些非常聪明的编程的话。如果您吹嘘自己比竞争对手快 50%,那么您最好在竞争对手之前使用多线程。

否则,请使用单线程解决方案。这要简单得多。(对我来说,数千听起来并不是很多数据。如果它可以达到数百万,那么多线程可能是值得的。)

于 2012-06-08T19:17:38.740 回答
1

多线程可以提供帮助,因为通常正常的 HTTP 执行包含许多 I/O。如您所知,IO 操作很繁重并且需要很长时间。因此,在实践中,当您有 1 个请求需要获取 A 类的实例和 B 类的实例时,如果您创建 2 个线程,一个用于访问 A 实例,另一个用于从数据库访问 B 类的实例,您可以将每个实例加载到单独的线程上,这样您将更有可能线程 A 执行其代码,而线程 B 在 IO 上被阻塞,反之亦然。因此,使用多线程可以赢得 IO 处理时间。

这是第一个好处。使用多线程的另一个好处是,您不必为传入连接保留空线程,而是使用异步事件处理模型。有一个很棒的实现使用了这种称为netty的技术,每秒可以处理 50 000 + 个请求。

于 2012-06-08T19:55:59.810 回答
0

多线程唯一擅长的是多核计算。

通常事件模型更轻量级,因为您可以完全控制代码执行。例如,如果您当前正在获取和处理 HTTP 标头并且需要唤醒其他一些线程,这意味着:

  • 完整的处理器状态被保存;
  • 当前的 cpu 缓存被严重破坏;
  • 一些代码运行;
  • 完整的处理器状态得到恢复。

在事件模型中,您将拥有结束整个周期、保存数据并参加另一个事件的完全权利。第二个事件将等到您完成工作。但是,您通过劫持工作代码所喷出的时间通常要长得多。

内存管理也很重要:在线程模型中,您需要锁来同步对重要数据的访问,而事件模型不需要锁,也不需要每个线程特定数据的额外内存。

这也是网络服务器背后的重点:这样 nginx 可以处理数千个连接而不会破坏机器。

于 2012-06-08T14:57:45.770 回答
0

线程是任务的最小单位。当一个任务/线程正在等待 i/o 或其他事情时,它将脱机,其他线程将开始执行。这发生在几微秒内。此外,如果我们有多个处理器,我们可以同时运行那么多线程。

我们需要谨慎对待我们可以制作的线程。一个线程不应依赖于另一个线程的输出。在这种情况下,多线程概念将给出快速的结果。有时我们需要依赖其他线程。那时我们使用同步。

如果您的所有操作都可以采用并行路径,那么多线程可以提高性能。如果操作相互依赖,那么您可以查看事件服务器。

于 2018-09-25T13:46:03.073 回答