如何决定是否在应用程序中使用线程或创建单独的进程以实现并行性。
答案 0 :(得分:15)
线程更轻,并且为了使几个“工作者”只是利用所有可用的CPU或核心,你最好使用线程。
当你需要工作人员更好地隔离和更强大时,就像大多数服务器一样,请使用套接字。当一个线程严重崩溃时,它通常会占用整个进程,包括在该进程中工作的其他线程。如果一个过程变坏并且死亡,它就不会触及任何其他过程,所以他们可以愉快地继续他们的商业,好像什么也没发生。
答案 1 :(得分:5)
进程拥有更多孤立的内存。这很重要有很多原因:
答案 2 :(得分:4)
并行度主要取决于计算机上可用的物理处理器/核心。如果您有单处理器/核心机器,那么单独的进程可能会导致过多的开销。在这种情况下,通常首选线程。
如果您有多个内核/ CPU,那么根据每个进程/线程的作用,如果开销合理,您可以选择进程。进程显然比线程具有更好的内存隔离级别 - 但与Windows同时,与线程相比,进程相当繁重。
线程当然可以在同一个进程中共享数据 - 但是你需要同步访问共享数据 - 以防止损坏状态。根据所使用的机制(如命名管道,基于自定义套接字的通信,使用远程处理框架,共享文件/数据库等),在流程之间共享数据更加复杂,开销(比简单的线程同步更为重要)。
答案 3 :(得分:2)
通常,当各个执行流不需要共享全局数据时,您应该使用进程,并且您希望每个数据都受到另一个的保护。
答案 4 :(得分:2)
我希望有几个链接可以帮助您做出决定:
http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/
http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast
答案 5 :(得分:1)
在Windows中,创建线程的进程比较重。因此,如果您有几个较小的任务,则线程或线程池会更好。或使用进程池来回收进程。在进程之间共享状态也是更多工作,然后在线程之间共享状态。但话说回来:线程可能会破坏整个进程的稳定性,从而使其他线程失效。如果你想最大限度地减少发生这种情况的可能性,你可以选择单独的流程。 .Net的AppDomains可能是两者之间的中间地带。