线程、进程与协程

目录

一、定义

1.进程

2.线程

二、区别

三、进程、线程、协程


一、定义

1.进程

1. 通俗理解一个运行起来的程序或者软件叫做进程。

2. 每次启动一个进程都需要向操作系统索要运行资源,让进程中的线程去执行对应的代码,进程是操作系统分配资源的基本单位。

3. 默认情况下一个进程只有一个线程,线程是依附在进程里面的, 没有进程就没有线程, 当在进程里面还可以创建多个线程。

2.线程

把进程想成现实生活中的公司,公司可以给员工提供办公资源(办公桌椅,办公电脑等资源), 真正干活的是员工,所以员工可以想成线程,公司就是进程。

二、区别

1. 进程是操作系统资源分配的基本单位,每启动一个进程都需要向操作系统索要运行资源,默认一个进程只有一个线程,线程是依附在进程里面的。
2. 线程是cpu调度的基本单位, 通过线程去执行进程中代码, 线程是执行代码的分支。
3. 多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大。
4. 多进程开发某个进程死了不会影响其它进程的运行,但是多线程开发该进程死了那么这些线程都要进行销毁。

三、进程、线程、协程

1. 先有进程,然后进程可以创建线程,线程是依附在进程里面的, 线程里面可以包含多个协程。

2. 进程之间不共享全局变量,线程之间共享全局变量,但是要注意资源竞争的问题。

3. 多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大。

4. 多线程开发线程之间执行是无序的,协程之间执行按照一定顺序交替执行。

5. 协程以后主要用在网络爬虫和网络请求,开辟一个协程大概需要5k空间,开辟一个线程需要512k空间, 开辟一个进程占用资源最多。

### 多线程、多进程协程的概念及其应用场景 在Python中,并发编程主要通过多线程、多进程协程三种方式实现。它们各自具有不同的特点和适用场景,适用于不同的任务类型和系统环境。 多线程是通过`threading`模块实现的。它允许程序在同一进程中同时执行多个线程,这些线程共享相同的内存空间。多线程适用于I/O密集型任务,例如网络请求或文件读写,因为在这种情况下,CPU可以在等待I/O操作完成的同时执行其他线程的任务。然而,由于全局解释器锁(GIL)的存在,Python中的多线程并不能充分利用多核处理器的优势,因此对于计算密集型任务来说,多线程可能不会带来显著的性能提升[^2]。 多进程则是通过`multiprocessing`模块实现的。线程不同,多进程能够真正地并行执行任务,这是因为每个进程都有独立的内存空间,并且可以利用多核CPU的能力。因此,多进程非常适合处理计算密集型任务,如图像处理或大规模数据计算。但是,进程间的通信相比线程间更为复杂,通常需要使用`Queue`或者`Pipe`等机制来交换数据[^2]。 协程是一种用户态的轻量级线程,由程序员自己控制调度。在Python中,协程可以通过`asyncio`库配合`async/await`语法来实现。协程特别适合用来编写异步I/O操作,比如处理大量并发连接的服务端程序。协程的优势在于其切换成本极低,而且不需要锁机制来管理共享资源,从而减少了上下文切换带来的开销。这使得协程非常适合用来构建高并发的服务端应用[^1]。 综上所述,选择哪种并发模型取决于具体的应用场景: - 对于I/O密集型任务,可以优先考虑使用多线程协程; - 对于计算密集型任务,则应该选用多进程以发挥多核CPU的威力; - 当需要处理大量的并发I/O操作时,协程会是一个非常好的选择,因为它可以在单线程内高效地处理成千上万的并发连接。 ### 示例代码:多线程 ```python import threading def worker(num): """thread worker function""" print('Worker: %s' % num) threads = [] for i in range(5): t = threading.Thread(target=worker, args=(i,)) threads.append(t) t.start() ``` ### 示例代码:多进程 ```python from multiprocessing import Process def f(name): print('hello', name) if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() p.join() ``` ### 示例代码:协程 ```python import asyncio async def count(): print("One") await asyncio.sleep(1) print("Two") asyncio.run(count()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值