Python:多任务,并发,并行的理解及线程、进程的对比

Python:多任务,并发,并行的理解及线程、进程的对比,第1张

概述Python:多任务,并发并行的理解及线程、进程的对比

什么叫“多任务”呢?简单地说,就是 *** 作系统可以同时运行多个任务。

再打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。

并行执行多任务只能在多核cpu上实现,但是,由于任务数量远远多于cpu的核心数量,所以, *** 作系统也会自动把很多任务轮流调度到每个核心上执行。

并发:交替处理多个任务的能力。指的是任务数多于cpu核数,通过 *** 作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)并行:同时处理多个任务的能力,指的是任务数小于等于cpu核数,任务真的是一起执行的。

多线程共享全局变量:

如果多个线程同时对同一个全局变量 *** 作,会出现资源竞争问题,从而数据结果会不正确。线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入 *** 作,从而保证了多线程情况下数据的正确性。

当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。

每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“locked”状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。

线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。 

 

2. 避免死锁 程序设计时要尽量避免(银行家算法)添加超时时间等进程线程的对比: 定义的不同

进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

区别 一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率线线程不能够独立执行,必须依存在进程中可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人优缺点

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。

GIL(全局解释器锁) 

通过代码可以发现 多进程可以充分使用cpu的两个内核 而多线程却不能充分使用cpu的两个内核

问题 : 通过验证我们发现多线程并不能真正的让多核cpu实现并行

原因 : cpython解释器中存在一个GIL(全局解释器锁),他的作用就是保证同一时刻只有一个线程可以执行代码,因此造成了我们使用多线程的时候无法实现并行

解决方案法 :

1:更换解释器 比如使用jpython(java实现的python解释器)

2:使用多进程完成多任务的处理

 

结论: 1. 在 处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快 2. 在 处理像IO *** 作等可能引起阻塞的这类任务的时候 多线程会比单线程快 总结

以上是内存溢出为你收集整理的Python:多任务,并发,并行的理解及线程、进程的对比全部内容,希望文章能够帮你解决Python:多任务,并发,并行的理解及线程、进程的对比所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1012987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存