当前位置:   article > 正文

多线程怎么保证数据安全_关于多线程和多进程

多进程和多线程写数据的安全问题

05df2e6dc488bd07d6573dcd91ed56ae.png

最近面试的时候吗,经常被问到多线程和多进程和协程之间的区别,每次这个问题都可以回答很长一段时间,这里统一总结下, 以下下次面试时能够从容回答。

什么是多线程:

线程是CPU调度的最小单位,是执行进程中的路径。线程是独立的,如果在一个线程中发生异常,不会影响其他线程;进程使用共享内存区域。

什么是多进程:

  1. 进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程,
  2. 我们运行的一个py脚本就是一个进程。每个进程都有自己独立的地址空间(内存空间),
  3. 每当用户启动一个进程时,操作系统就会为该系统分配一个独立的内存空间,让应用程序
  4. 在这个独立的内存空间中运行。

什么是协程

  1. 是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。
  2. 协程调用切换时,将寄存器上下文和栈保存到其他地方,再切回来的时候,恢复先前保存的寄存器上下文和栈,
  3. 直接操作栈则没有内核切换的开销,可以不加锁的访问全局的变量,所以上下文切换非常快。

那么什么时候选择时候多线程什么时候使用多进程呢?

一般回答CPU密集型使用多进程,IP密集型使用多线程即可。

在使用多线程的时候会出现什么问题吗?

  1. 在使用多线程的时候会出现多线程竞争
  2. 多线程竞争是因为线程是非独立的,同一个进程中线程是数据共享的,
  3. 当各个线程访问数据资源时会出现竞争状态,
  4. 即:数据几乎同步被多个线程占用,造成数据混乱,即多为的线程不安全。

怎么解决多线程竞争问题?

  1. 线程同步能保证多个线程安全访问竞争资源,最简单的同步机制死引入互斥锁
  2. 互斥锁为资源银土一个状态:锁定/非锁定
  3. 某个线程要更改为共享数据时,先将其锁定,此时资源的状态为"锁定",其他线程不能更改;
  4. 直到该线程释放资源,将资源的状态变成"非锁定",其他的线程才能再次锁定该资源。
  5. 互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

使用了锁之后,会出现哪些坏处和好处?

  1. 锁的好处:
  2. 确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行
  3. 能解决多线程资源竞争下的原子操作问题。
  4. 锁的坏处:
  5. 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率大大地降低了。
  6. 锁的致命问题:
  7. 死锁

死锁产生的原因以及如何避免

  1. 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
  2. 避免死锁:
  3. 程序设计要尽量避免(银行家算法)
  4. 添加超时时间等

Python中的多线程是真实的多线程么?

  1. python中的多线程是伪多线程,因为存在GIL。
  2. 1、Python语言和GIL没有关系,只是因为历史原因在Cpython虚拟机(解释器)中难以移除GIL
  3. 2、GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
  4. 3、线程释放GIL锁的情况:在IO操作等可能引起阻塞的system call之前,可以暂时释放GIL,
  5. 但在执行完毕后,必须重新获取GIL,python3使用计时器(执行时间到达阈值后,当前线程释放GIL)
  6. 或python2,tickets计数达到100
  7. 4、Python使用多进程是可以利用多核CPU资源的
  8. 5、多线程爬虫比单线程性能有提升,是因为IO阻塞会自动释放GIL锁

暂时总结这么些,有时间继续补充。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/143644
推荐阅读
相关标签
  

闽ICP备14008679号