24

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

4

6 回答 6

15

线程的重量更轻,为了让几个“工人”只是为了利用所有可用的 CPU 或内核,你最好使用线程。

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

于 2008-09-15T13:43:41.173 回答
5

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

  • 单个任务更难使其他任务崩溃。
  • 每个进程将有更多内存可用。这对于像 Apache 这样的大型高性能应用程序或像 Postgres 这样的数据库服务器很重要。这对于分配的内存和内存映射文件都很重要。
于 2008-09-15T14:40:56.603 回答
4

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

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

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

于 2008-09-15T13:40:35.890 回答
2

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

于 2008-09-15T13:38:59.780 回答
2

我希望有几个链接可以帮助您做出决定:

http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/ http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast

于 2008-09-15T13:41:58.853 回答
1

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

于 2008-09-15T13:41:31.677 回答