Python(0)—多线程与多进程

1、多线程

  线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,一个进程可以包含多个线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。本质上CPU同一时刻只干了一件事,只能执行一个线程。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。

  并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。

2、多进程

  一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)

  每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程。

  某个线程想要执行,必须先拿到GIL(全局解释器锁),我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高。 

  每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。        
                                
  所以在这里说结论:多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率        

3、线程和进程的区别

(1)线程共享内存空间;进程的内存是独立的

(2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现

(3)创建新线程很简单; 创建新进程需要对其父进程进行一次克隆

(4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程

(5)改变主线程(如优先权),可能会影响其它线程;改变父进程,不影响子进程

 

posted @ 2018-12-12 21:23  深度机器学习  阅读(709)  评论(0编辑  收藏  举报