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

Posted faopopo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进阶--多进程与多线程概念

线程进程携程理解

python多进程

Python并发编程—进程

python并发编程之多进程理论部分

python并发编程之多进程