多线程多进程协程的区别和不同的应用场景

本文介绍了并发与多任务处理的概念,包括多线程、多进程、协程的区别及应用场景,探讨了它们如何帮助提高程序执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当然既然是都是 多这个字开头,那么就是多任务,我们需要了解

并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,

        实现⽤多个任务“⼀起”执⾏(实际上总有⼀些任务不在执⾏,因为切换任    
        务的速度相当快,看上去⼀起执⾏⽽已)

并⾏:指的是任务数⼩于等于cpu核数,即任务真的是⼀起执⾏的

多线程(threading):①在⼀个进程内的所有线程共享全局变量,很⽅便在多个线程间共享数据

            ②缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量

                的混乱(即线程⾮安全)

            ③如果多个线程同时对同⼀个全局变量操作,会出现资源竞争问题,从⽽

                数据结果会不正确

 

解决线程同时修改全局变量的⽅式:互斥锁(互斥锁为资源引⼊⼀个状态:锁定/⾮锁定
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他
线程不能更改;直到该线程释放资源,将资源的状态变成“⾮锁定”,其他的
线程才能再次锁定该资源。互斥锁保证了每次只有⼀个线程进⾏写⼊操作,
从⽽保证了多线程情况下数据的正确性。)

多进程(multiprocessing):进程不共享全局变量

                                              如果子进程因为某种原因崩溃了,不会直接导致主程序的崩溃,可以降低主程序崩溃的概率;

                                                  即使主进程退出了,子进程仍然可以继续工作,比如子进程是推送服务,在主进程退出的情况下,仍然能够保证用户可以收到推送消息。


协程(greenlet,gevent升级版):

            ①⽐线程更⼩占⽤更⼩执⾏单元(理解为需要的资源)

            ②它是⼀个执⾏单元,因为它⾃带CPU上下⽂

              通俗的理解:在⼀个线程中的某个函数,可以在任何地⽅保存当前函数的⼀
些临时变量等信息,然后切换到另外⼀个函数中执⾏,注意不是通过调⽤函
数的⽅式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开
发者⾃⼰确定

            

进程,能够完成多任务,⽐如 在⼀台电脑上能够同时运⾏多个QQ
线程,能够完成多任务,⽐如 ⼀个QQ中的多个聊天窗⼝


定义的不同
进程:是系统进⾏资源分配和调度的⼀个独⽴单位.
线程:是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的
          能独⽴运⾏的基本单位.线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运
          ⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀
          个进程的其他的线程共享进程所拥有的全部资源.
区别
    ⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程.
    线程的划分尺度⼩于进程(资源⽐进程少),使得多线程程序的并发性⾼。        
    进程在执⾏过程中拥有独⽴的内存单元,⽽多个线程共享内存,从⽽极        

⼤地提⾼了程序的运⾏效率

    线线程不能够独⽴执⾏,必须依存在进程中
    可以将进程理解为⼯⼚中的⼀条流⽔线,⽽其中的线程就是这个流⽔线
上的⼯⼈


优缺点:线程和进程在使⽤上各有优缺点:线程执⾏开销⼩,但不利于资源的管理和

            保护;⽽进程正相反。

协程和线程差异
在实现多任务时, 线程切换从系统层⾯远不⽌保存和恢复 CPU上下⽂这么简
单。 操作系统为了程序运⾏的⾼效性每个线程都有⾃⼰缓存Cache等等数
据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换⾮常耗性
能。但是协程的切换只是单纯的操作CPU的上下⽂,所以⼀秒钟切换个上百
万次系统都抗的住。

小结:

1. 进程是资源分配的单位

2. 线程是操作系统调度的单位
3. 进程切换需要的资源很最⼤,效率很低
4. 线程切换需要的资源⼀般,效率⼀般(当然了在不考虑GIL的情况下)

5. 协程切换任务资源很⼩,效率⾼

6. 多进程、多线程根据cpu核数不⼀样可能是并⾏的,但是协程是在⼀个线
程中 所以是并发


应用场景:

多线程 : 常见的浏览器、Web服务(现在写的web是中间件帮你完成了线程的控制),web处理请求,各种专用服务器(如游戏服务器)

需要频繁创建销毁的优先用线程

需要进行大量计算的优先使用线程(CPU频繁切换

多进程:使用场所:目标子动能交互少,如果资源和性能许可,可以设计由多个子应用程序来组合完成目的



### 进程、线程协程区别及其应用场景对比 #### 1. 定义与基本概念 - **进程**是指一个正在运行的程序实例,是系统进行资源分配的基本单位。每个进程都有独立的内存空间,拥有自己的地址空间系统资源[^1]。 - **线程**是进程内的执行单元,可以看作是进程中的“工作人员”。线程共享同一进程的内存空间其他资源,因此线程间的通信比进程间通信更高效[^1]。 - **协程**是一种用户态的轻量级线程,由程序员手动控制其调度。协程可以在单线程内实现并发操作,通过异步机制提高效率[^2]。 #### 2. 资源消耗与切换成本 - **进程**:由于每个进程有独立的内存空间,创建销毁进程的成本较高。进程间的切换也需要耗费较的时间资源[^1]。 - **线程**:线程共享同一进程的资源,因此创建销毁线程的成本低于进程。然而,线程切换仍然需要一定的开销,尤其是在多线程竞争锁时可能会导致性能瓶颈。 - **协程**:协程的创建切换成本极低,几乎不需要操作系统介入。它在单线程中实现并发,避免了多线程带来的上下文切换开销[^2]。 #### 3. 并发模型 - **进程**:进程之间的并发是通过操作系统调度实现的。个进程可以并行运行在核CPU上,但进程间通信较为复杂[^1]。 - **线程**:线程的并发也是由操作系统调度完成。虽然线程间通信较简单,但由于GIL(全局解释器锁)的存在,Python中的多线程并不能充分利用核CPU的性能[^2]。 - **协程**:协程通过异步编程模型实现并发,能够在单线程中模拟任务执行。协程本身不具备并行能力,但可以通过多线程多进程结合协程来利用核CPU[^2]。 #### 4. 应用场景 - **进程**:适用于需要独立内存空间高隔离性的场景,例如任务处理、分布式计算等。当任务之间相互独立且不需要频繁交互时,使用进程更为合适。 - **线程**:适合于需要共享资源的场景,例如Web服务器、数据库连接池等。线程能够快速响应用户的请求,并保持较低的资源消耗。 - **协程**:适用于IO密集型任务,例如网络爬虫、文件读写、Web服务等。协程能够显著提高IO等待时间的利用率,从而提升系统的吞吐量[^2]。 #### 5. 示例代码 以下是一个简单的Python示例,分别展示进程、线程协程使用方式: ```python # 进程示例 from multiprocessing import Process def process_task(): print("Process running") p = Process(target=process_task) p.start() p.join() # 线程示例 from threading import Thread def thread_task(): print("Thread running") t = Thread(target=thread_task) t.start() t.join() # 协程示例 import asyncio async def coroutine_task(): print("Coroutine running") await asyncio.sleep(1) asyncio.run(coroutine_task()) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值