进程和线程的基本概念以及Python中的多线程

进程和线程的基本概念以及Python中的多线程

八月 02, 2018

【什么是进程】 进程是操作系统用来调度和分配资源的单位。每一个应用程序至少有一个进程。 可以这样来说:进程是竞争计算机资源的基本单位。 理论上来说:单核CPU 永远只能执行一个应用程序。因为单核CPU在同一时刻只能运行一个进程。 但是由于CPU的运算速度非常快。他可以在不同的应用程序进程之间切换,切换的时间非常短。我们是感知不到的。 理论上:多核CPU可以同时执行多个应用程序和进程。 【关于进程调度】 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。 每个操做系统有对应的算法,挂起应用程序,切换另外一个进程。 频繁的切换进程是非常消耗系统资源。这里是因为上下文的原因(保持当前程序的状态)。 【线程】 线程是进程的一部分。一个进程可以有一个线程,也可以有多个线程。 线程产生的原因:CPU速度之快,用进程去管理CPU的资源粒度太大了,不能够有效和充分地利用CPU的资源。需要更小的单元去管理CPU的资源。线程之间的切换所消耗的资源远比进程之间的切换所消耗的资源。 线程和进程的分工不同。进程用来分配资源(如内存资源)。线程是利用CPU执行代码的,线程不拥有资源,但是它可以访问进程的资源。 【Python代码演示多线程】 1、使用多线程模式执行work函数,进行断点调试,work函数中有一个sleep(5),但由于是多线程的原因,程序不会卡住而会直接跳到下一个断点处。一旦我们在主线程里面启用了一个新的线程,那么这个线程的执行已经和主线程没有关系了。所以新启用的线程里的代码什么时候执行取决于CPU的进程调度和Python解释器。 2、使用单线程模式执行worker函数。直接在主线程里面调用worker()函数,当启动调试后,点击进入第一个断点,点击进入下一断点的时候,程序不会立即进入下一个断点,而是呈现了一个假死的状态(卡住5s)。等待所有代码都执行完才会执行后面的代码。 【多线程编程的优势】 会更加充分地利用CPU的性能优势,从而加快代码的执行速度。 多线程意义:对于多核CPU。让主线程跑在A核CPU,让从线程跑在B核CPU上。 【全局解释器锁GIL】 但是,Python不能充分利用多核CPU的优势。Python中的GIL(全局解释器锁)机制导致Python不能够使用多核CPU。同一时刻只能在一个核上执行一个线程。GIL的作用:线程安全。多个线程会共享一个进程资源。这样就导致了线程不安全。一旦我们对某一个变量进行了加锁操作后,只有拿到锁的线程才能对这个变量进行操作。 对于语言来讲,锁可以分为两类:1、细粒度锁 程序员主动加的。2、粗粒度锁 在解释器层的GIL。由于解释器GIL的的存在,一定程度上保证额。GIL是cpython解释器里的实现。而jpython中没有GIL。 那么,Python的多线程就是鸡肋了吗? 假设一段有10个线程的代码,这样的程序非常依赖CPU计算,是CPU密集型程序。但是对于IO密集型程序(如查询数据库、请求网络资源、读写文件)。我们写的绝大多数代码都是IO密集型程序。CPU密集型和IO密集型程序是按照时间段消耗在哪种类型的操作上面来划分的。 结论:Python的多线程对于IO密集型程序是有意的。