多线程究竟是如何工作的?

时间:2012-06-08 14:48:43

标签: multithreading concurrency scalability

我想知道多线程究竟是如何解决可伸缩性的问题的。我的基本理解是当一个新线程中的请求被提供给服务请求时。但是在幕后究竟发生了什么。

我目前正在开始一个项目,我必须构建一个存储云来处理1000个GET,PUT,DELETE操作。多线程地址可扩展性还是应该调查服务器?

4 个答案:

答案 0 :(得分:2)

多线程允许一次运行多个线程。在多核计算机上,这意味着两个线程可以真正并行运行,执行两次一次运行的线程。理想情况下,在4核心机器上,使用4个线程,您将获得的工作量几乎是单个线程的4倍。

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

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

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

答案 1 :(得分:0)

多线程的唯一优点是多核计算。

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

  • 保存完整的处理器状态;
  • 当前的cpu缓存是patrly thrashed;
  • 一些代码运行;
  • 完整处理器状态恢复。

在活动模型中,您将有权利结束整个周期,保存数据,然后您将参加另一项活动。第二次活动将等到你完成工作。但是,你通过劫持工作代码所花费的时间通常要大得多。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

线程是任务的最小单元。当任务/线程正在等待I / O或其他事物时,它将被脱机并且其他线程将开始执行。这发生在几分之一微秒内。另外,如果我们有多个处理器,那么可以同时运行多个线程。

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

如果所有操作都可以采用并行路径,则多线程可以提高性能。如果操作彼此依赖,则可以查看事件服务器。