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

编程之家收集整理的这篇文章主要介绍了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:多任务,并发,并行的理解及线程、进程的对比所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

猜你在找的Linux相关文章

概述 最近学习网络相关知识点,很多文章提到针对TCP time wait(后续简称TW)状态连接进行优化的参数tcp_tw_reuse和tcp_tw_recycle,并且不少文章提到了启用tcp_tw
转载请注明来源 'https://www.cnblogs.com/sogeisetsu/p/11407764.html' git reset 的HEAD和 hard 指的是从库恢复暂存区某一个文件,如
本文比较长,但讲的会比较细,如果只是想实现中文man的功能https://www.jianshu.com/p/262f6cc8f898
转载自git 中文官网 Git-工具-重置揭密
deactivate
对过去写的一些关于Linux的博客尝试做了一个整合的工作,我发现这个工作比我想象的要复杂,因为对之前写的文章多有不满,于是我尽力让文章变得通俗易懂且将所有引用的地方都标注出来,在整理的过程中,我有了一
增加 的启动项 问题描述 打开电脑,进入bios没有deepin启动项 解决办法 进入 ,选择 ,选择 ,增加启动项,名字写Linux,地址填 === 博客园 sogeisetsu 原创作品,转载请注
来自Stackoverflow
链接:http://stackoverflow.com/questions/10312521/how-to-fetch-all-git-branches
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注