python-进程、线程、协程、锁

问题:线程之间的切换是会产生锁的,在线程执行之前,会在cpython解析器上上锁,这个锁就是全局解析器锁(GIL)

其实python中的多线程是假的多线程!!!

python代码是有Cpython解析器来解析(有不同版本的解析器,例如pypy、Jpython),像单核cpu运行多个进程一样,内存中可以有多个进程,但是单位时间内,只有一个进程在使用CPU。同样,虽然Python解析器可以运行多个线程,但是一个时间,只有一个线程在解析器上运行。

多线程竞争?

线程是独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎同步会被多个线程占用,造成数据混乱,即所谓的线程不安全

GIL锁,全局解析器锁(只有在cpython里才有)

作用:限制多线程同时执行,保证同一时间只有一个线程执行,所以cpython里面的多线程其实是伪多线程

所以Python里常常使用协程技术来代替多线程,协程是一种更轻量级的线程.

 三者的关系: 进程里有线程,线程里有协程.

python虚拟机的访问由全局解析器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。在多线程环境中,Python虚拟机按照以下方式执行:

1.设置GIL

2.切换到一个线程去执行

3.运行

4.把线程设置为睡眠状态

5.解锁GIL

6.重复执行

重点理解:

比如:有一个4核CPU,在单位时间内每个核只能跑一个线程,那能用4个核跑4个线程。但是python不一样,它不管有多少核,单位时间多个核只能跑一个线程,然后时间片轮转切换。因为任何python线程执行前,必须先获得GIL锁。上锁解锁,别的线程再上锁,再解锁。即使100个线程跑在100核CPU上,也只能用单核。

python多线程相当于单核多线程,多线程有两个好处,CPU并行,IO并行。

在python中,可以只用多线程,但是不要指望有效利用多核。如果要使用多线程利用多核,就只能通过C扩展。Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

python中进程和线程的使用场景

多进程适合在cpu密集型操作(CPU指令比较多)

多线程适合在IO密集型操作(读写数据操作)

线程是并行还是并发?进程是并行还是并发?

线程是并发,进程是并行

并行:同一时刻多个任务同时在运行

并发:在同一时间间隔内多个任务在运行,但是并不会在同一时间同时运行,存在交替执行的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,进程线程协程是实现并发编程的不同方式。 1. 进程(Process)是操作系统分配资源的基本单位,每个进程有独立的内存空间,互不干扰。进程之间的通信需要使用特定的机制,如管道、消息队列等。在Python中,可以使用`multiprocessing`模块创建和管理进程。 2. 线程(Thread)是进程内的独立执行流,一个进程可以包含多个线程,它们共享相同的内存空间。线程之间的通信比进程更方便,可以使用共享内存或者全局变量。然而,由于全局解释器(GIL)的存在,同一时间只有一个线程在执行Python字节码,因此多线程在CPU密集型任务中并不能提高性能。但是对于I/O密集型任务,多线程可以提升效率。Python内置的`threading`模块提供了对线程的支持。 3. 协程(Coroutine)是一种轻量级的线程,由程序控制在特定位置进行挂起和恢复的并发执行。协程能够在执行过程中被暂停和继续,并且可以通过yield语句进行交互式通信。Python中的协程通过生成器函数(generator function)和`asyncio`库来实现。 总结一下: - 进程是资源分配的基本单位,进程之间资源独立,通信复杂。 - 线程进程内的执行流,共享内存,通信相对方便,但受到GIL的限制。 - 协程是一种轻量级的线程,可以在特定位置挂起和恢复执行,并通过yield语句进行通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值