17.8.1 什么时候使用多线程

对程序逻辑来说,多线程有时候挺方便的。例如,一般情况下你不应该在同一个线程上进行网络包收发和界面渲染。界面线程需要响应用户行为(点击按钮)并经常进行重绘(例如,当响应的窗口被其它窗口挡住,之后又恢复的时候)。然而网络行为则会一直其工作线程,直到完成收发工作。这也就是为什么要将这种行为划分到其它线程中去做并发执行。

多线程可以提升程序的性能,不过这种说法不能覆盖所有 case。常见的任务分为 CPU 密集和 I/O 密集型。

  • CPU 密集型代码在分配更多 CPU 的情况下就可以更快执行。它会使用大部分的 CPU 时间来进行计算,且在该过程中不从磁盘或外部设备中读取数据。
  • IO 密集型代码在分配更多 CPU 时间的情况下也不会被加速,因为这种代码主要是慢在对内存和外部设备的大量使用。

使用多线程来加速 CPU 密集型的程序是可能的。一般的模式会使用一个队列,将请求分发给线程池(其中有一些预分配的线程,可能在工作,也可能在等待,这样就不用在每次需要的时候都创建新线程)中的工作线程。参考第 7 章 [23] 来获知详情。

如果问我们需要多少线程的话,是没有通用的答案的。创建线程,线程切换和对线程进行调度都会产生一定的成本。如果线程本身没多少活儿要干,这些动作都可能会使整个程序变慢。一些人建议在计算密集型的任务中创建 n-1 个线程,n 的值是处理器核心数。在一些天然需要线性执行(每一步都直接依赖上一步产生的结果)的任务中,创建多个线程就没什么用了。这里我们推荐在不同的工作负载下,对你的线程数进行实验,以找出最适合你的计算任务的线程数。

results matching ""

    No results matching ""