关于python中的进程和线程,知道这些就足够了

1、并发与并行的区别和联系?

并发:一个cpu交替执行多个进程
并行:多个cpu同时执行多个进程

2、程序中的同步和异步?

同步:是指协同合作,相互配合。有执行的先后顺序,比如a和b两个线程同时完成一个任务,a先做,某一时刻它需要b的返回结果才能继续往下做,就通知b来做,b做完了再通知a继续做。
异步:与同步相反,我做好了我告诉你一下之后就自己继续往下做,不管你有没有在做。

3、进程、线程、协程的区别和联系?

区别:

  1. 进程:操作系统进行资源调度的最小单位,系统中的一个应用程序就是一个进程,如qq,进程与进程之间内存相互独立,进程之间不能直接通信,需通过中间件,进程只能操作子进程
  2. 线程:cpu进行资源调度的最小单位,进程中的所有线程共享一片内存空间,线程之间可以直接进行通信,线程可以操作其它线程
  3. 协程:协程又称微线程,是用户态的轻量级的线程,拥有自己的上下文寄存器

联系:

  1. 线程是进程运行的实际单位
  2. 线程是进程下的一个单一顺序的控制流,一个进程可以并发多个线程,每个线程可以并行的执行不同任务
  3. 进程要想操作cpu需经过线程
  4. 协程是特殊的线程

4、多进程和多线程的区别?

  1. 进程之间的内存独立,同一个进程下的线程之间内存共享
  2. 线程之间可以直接通信,进程需要通过中间件才可以
  3. 进程只能操作其子线程,进程可以操作其它线程
  4. 创建一个线程很简单,创建一个进程需要对其父进程进行一次克隆
  5. 多线程,多有线程的进程号都一样,多进程,所有子进程的线程号都不一样
  6. 多线程可以共享全局变量,多进程不可以,各自有一个拷贝在自己的进程中

5、协程的优势是什么?

  1. 无上下文切换的开销
  2. 无原子性操作的锁定和同步的开销
  3. 方便切换控制流
  4. 高并发+高扩展性+低成本

6、多线程和多进程分别用于哪些场景?

多线程:适合io操作密集的情况,如聊天室
多进程:适合cpu操作密集的情况,如数据计算

7、全局解释器锁(GIL)是什么?如何解决 GIL 问题?

同一时刻只允许一个线程在运行,属于解释器级别,由操作系统直接进行调度,是Cpython解释器独有的,其它类型的解释器没有

如何解决:

  1. 换其它的解释器
  2. 使用多进程

8、Python 中有哪些锁(LOCK)?它们分别有什么作用?

  1. GIL:全局解释器锁,同一时刻只允许一个线程在运行,属于解释器级别,由操作系统直接进行调度;可以避免大量的加锁解锁操作,保证数据的安全性
  2. 互斥锁:同一时刻同一个进程下只有一个线程在操作cpu,属于用户级别的锁;可以保护数据的安全性
  3. 递归锁:互斥锁如果想实现多层嵌套的效果,会造成死锁的线程,递归锁就可以解决这个问题,它就像一个字典,保存了锁的门和门的钥匙
  4. 信号量:允许同一时刻一定数量的线程同时允许,用于维护资源,比如实现停车场管理的功能

9、Python 中如何实现多线程和多进程?

多线程:使用threading模块的Thread类+循环
多进程:使用multiprocessing模块的Process类+循环

10、守护线程和非守护线程是什么?

程序的主线程运行结束后,会等待非守护线程的运行结束而结束整个程序,当把某些线程设置为守护线程之后,主线程运行结束后,守护线程也会直接结束,不管有没有运行完成。

11、多线程的执行顺序是什么样的?

随机的,由操作系统进行调度

12、多线程非安全和多线程安全?

多线程非安全是指多线程同时操作发生写冲突的情况。
多线程安全是指多线程操作不会发生写冲突的情况。

13、互斥锁是什么?有什么好处和坏处?

指同一时间段同一个进行下只有一个线程在使用cpu,属于用户级别的锁
好处:解决了资源竞争的问题,保证了数据的安全性
坏处:并行变串行,执行效率变低

14、什么是僵尸进程和孤儿进程?

僵尸进程:子进程先于父进程结束,且父进程没有处理子进程的退出状态,这样的子进程称之为僵尸进程,僵尸进程虽然结束了,但是部分的进程信息会残留在内存中,大量的僵尸进程会导致浪费内存资源
孤儿进程:父进程先于子进程运行结束,此时的子进程就成为了孤儿进程,孤儿进程会被系统进程收养,成为系统进程的子进程

15、多线程和多进程如何实现通信?
多线程可以使用Queue、Event实现通信
多进程可以使用Queues、Pipes、Managers实现通信

16、Python 3 中 multiprocessing.Queue() 和 queue.Queue() 的区别?
multiprocessing.Queue()是跨进程通信队列,是进程之间进行通信的队列
queue.Queue()是进程内的非阻塞队列,是线程之间的通信

17、如何使用多协程并发请求网⻚?
可以使用Gevent协程来实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值