Day10-5【Python 进程和线程】多线程与多进程:你是选择稳定的Apache,还是高效的IIS?

在现代计算中,如何实现高效的多任务处理无疑是个热点话题。多进程、多线程是两种经典的方式,但它们各自有着不可避免的优缺点。今天我们就来盘一盘,看看这两位老大哥如何“角力”,让你轻松选择适合自己项目的那一位。

 

1ea4b566a86b1062805cea2533dfeb6c.jpeg

 

 

一、多进程 VS 多线程:谁更适合你的“大作业”?

首先,要搞清楚一个事——多任务的执行通常采用 Master-Worker 模式。主控(Master)负责分配任务,工人(Worker)负责执行任务。就像老师在班级里安排作业:老师负责布置作业(Master),学生负责完成作业(Worker)。无论你是选择“多进程”还是“多线程”,大家都在同一套“班级制度”下运作。

1.1 多进程:你可以崩溃,但我不怕!

如果你采用 多进程,那么每个任务的执行都会在一个独立的进程中运行。主进程(Master)负责任务分配,其他子进程(Worker)负责具体执行。最大优点就是:如果一个子进程崩溃了,主进程和其他子进程照样不受影响。简直就是多任务中的“铁人三项”!你可以尽情处理不同的任务,别人崩溃了不影响你。

多进程的“致命伤”

不过,这种独立性也带来了代价。创建进程的开销大,特别是在 Windows 系统上,进程创建的代价简直大得惊人。所以,在几千个进程同时运行时,操作系统连调度任务的能力都成了问题,效率就大大下降了。

1.2 多线程:速度快,但能量不集中

多线程 是多任务处理的另一个经典方式。主线程负责任务分配,子线程(Worker)负责具体执行。相比于多进程,线程间共享内存,所以切换速度更快,效率相对较高。假如你使用 IIS(微软的Web服务器),你会发现它默认采用的就是 多线程模式。这种方式就像是一个高效的团队,每个成员都能直接读取共享的资源,工作起来能更加协调。

多线程的“隐患”

然而,问题来了——多线程最大的问题就是:如果一个线程挂掉,整个进程可能就崩了。因为所有线程共享同一进程的内存,当一个线程出现问题,整个进程就像是一个“大厦”掉了根柱子,随时可能崩塌。你可能在 Windows 上看到过这样的提示:“该程序执行了非法操作,即将关闭”。其实,这时候通常是某个线程崩了,操作系统“连锅端”了整个进程。

1.3 所以,究竟选哪个?

  • 如果你追求 稳定性,想要确保即使某个任务崩溃了也不影响整体运行,多进程模式 是你的不二选择。著名的 Apache 服务器最早就是采用这个模式。

  • 如果你更注重 效率,且能够接受少量的不稳定性,多线程模式 会是一个不错的选择,尤其适合高并发的Web应用。

当然,也有一种 “聪明”的方案:混合使用多进程和多线程。比如 IIS 和 Apache 都支持这种混合模式,可以兼顾效率和稳定性,但问题也变得更加复杂了。

 

 

二、线程切换:太频繁的“换席”效率更低

多进程和多线程的“闪亮登场”背后,有一个共同的问题:任务切换。假设你正在做五科作业,每科作业1小时。如果你按顺序完成这些作业,1小时/科,5小时总共搞定。但如果你切换任务,一分钟切换一次,你看似在同时做五科作业,但每次切换都会有一些“浪费时间”的动作——收拾书本、准备工具。这就像操作系统中的任务切换:保存当前任务状态,加载新任务状态,这个过程虽然很快,但消耗时间也不小。切换过多时,系统可能反而忙于“切换”,而无法有效执行任务。

所以,如果任务过多,效率反而下降,CPU和内存的资源都被“占用了”,系统陷入了所谓的“假死状态”。

 

 

三、计算密集型 VS IO密集型:你的任务属于哪个类型?

选择多进程还是多线程,不仅仅取决于任务的数量,还要看任务的类型。我们把任务分为两大类:计算密集型 和 IO密集型

3.1 计算密集型:CPU的“铁人三项”

计算密集型任务主要依赖CPU进行计算。比如计算圆周率、视频解码、数据压缩等。这类任务,若想要提高效率,最好的方法是 限制并发量,并且最好使用 C语言 编写。为什么?因为 Python 等脚本语言虽然非常灵活,但效率实在低,根本无法满足高效计算的需求。

此外,如果你的任务是计算密集型的,多进程 是更好的选择。因为每个进程会占用一个CPU核心,操作系统可以更高效地进行调度。总之,计算密集型任务的关键是 CPU资源

3.2 IO密集型:让CPU“稍作休息”

与计算密集型任务不同,IO密集型 任务通常不需要太多的CPU计算,而是大量等待外部资源,比如网络、磁盘读写等。常见的任务有 Web 应用、网络请求等。

对于这类任务,CPU不忙,你反而可以更多地利用 多线程 或 异步IO 来实现高效并发。尤其是在Python中,使用 协程 可以让你的程序在等待IO时不浪费时间。

 

 

四、异步IO:告别“等待”和“浪费”

在面对IO密集型任务时,你会发现,任务大部分时间都在等待IO操作完成。这里就需要引入 异步IO,这项技术允许在等待IO操作时,执行其他任务,从而极大提升效率。

比如在 Nginx 这种服务器中,采用的是 事件驱动模型,通过异步IO,在单核CPU上也能高效支持多任务执行。而在多核CPU上,操作系统通过多个进程来充分利用每个核心,提升性能。

协程:Python的“轻量级线程”

Python通过协程进一步简化了这个过程。协程允许你在一个线程中切换任务,这样一来,IO密集型任务就可以在单线程中高效运行,避免了多线程带来的复杂性和开销。

 

 

* 小结:多任务的“选择题”

  • 多进程:稳定性强,但开销大,适用于计算密集型任务。

  • 多线程:效率高,但稳定性差,适用于IO密集型任务。

  • 混合模式:在 Apache 和 IIS 中常见,兼顾效率和稳定性。

  • 异步IO + 协程:应对高并发的现代解决方案,尤其适用于IO密集型任务。

选择哪种方式,最终取决于你的任务类型、平台及对性能的需求。在多任务的世界里,找到适合自己的那一款“工具”,才是高效的第一步!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值