如何决定是在应用程序中使用线程还是完全创建单独的进程来实现并行性。

有帮助吗?

解决方案

线程的重量更轻,并且为了让多个“工作者”能够利用所有可用的 CPU 或内核,最好使用线程。

当您需要工作人员更好地隔离和更强大时(就像大多数服务器一样),请使用套接字。当一个线程严重崩溃时,它通常会导致整个进程崩溃,包括在该进程中工作的其他线程。如果一个进程变坏并死亡,它不会影响任何其他进程,因此他们可以愉快地继续他们的业务,就像什么都没发生一样。

其他提示

进程有更多的隔离内存。这很重要,原因有很多:

  • 单个任务很难使其他任务崩溃。
  • 每个进程将有更多可用内存。这对于 Apache 等大型高性能应用程序或 Postgres 等数据库服务器非常重要。这对于分配的内存和内存映射文件都很重要。

并行度主要取决于机器上可用的物理处理器/内核。如果您有一台单处理器/核心机器,那么拥有单独的进程可能会导致过多的开销。在这种情况下,线程通常是首选。

如果您有多个核心/CPU,那么根据每个进程/线程的功能,如果开销合理,您可以选择进程。进程显然比线程具有更好的内存隔离级别 - 但同时在 Windows 中,与线程相比,进程相当繁重。

线程当然可以在同一进程中共享数据 - 但同样,您需要同步对共享数据的访问 - 以防止损坏状态。在进程之间共享数据更加复杂,开销(比简单的线程同步更大)取决于所使用的机制,例如命名管道、基于自定义套接字的通信、使用远程处理框架、共享文件/数据库等。

通常,当各个执行流不需要共享全局数据并且您希望彼此受到保护时,您应该使用进程。

在 Windows 中,创建进程比创建线程更繁重。因此,如果您有几个较小的任务,那么线程或线程池会更好。或者使用进程池来回收进程。此外,在进程之间共享状态比在线程之间共享状态需要更多工作。但话又说回来:线程可能会破坏整个进程的稳定性,从而导致其他线程崩溃。如果您想最大程度地减少发生这种情况的可能性,您可以采用单独的流程。.Net 的 AppDomains 可能是两者之间的中间地带。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top