您的位置:首页 > 编程语言 > Python开发

Python高级编程--多线程编程(一)

2017-09-12 16:52 274 查看

进程和线程  

   进程(重量级进程)是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈以及他记录其运行轨迹的

辅助数据。操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间。不过各个进程有自己的内存

空间、数据栈等,所以只能使用进程间通信(IPC) 而不能直接共享信息。

    线程(轻量级进程)与进程不同,所有的线程运行在同一进程中,共享相同的运行环境,它们可以被想象成在主

进程中并行运行的“迷你进程”。

    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。

它有一个自己的指令指针,记录自己运行到什么地方。线程的运行可能被抢占(中断),或暂时的被挂起(睡眠),让

其他的线程运行,这叫让步。一个进程中各个线程共享一片数据空间,所以线程之间可以比进程之间更方便地共

享数据和通信。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

全局解释锁(GIL)

    python 代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中,

同时只有一个线程在执行,就像单个cpu的系统中运行多个进程那样,内存中可以存放多个程序,但是任意时

刻,只有一个程序在cpu中运行。同样,虽然Python解释器中可以运行多个线程,但在任意时刻,只有一个线

程在解释器中运行。

    对Python虚拟机的访问由全局解释器锁(Global interpreter lock,GIL)来控制,正是这个锁能保证同一时刻只有

一个线程在运行。在多线程环境下,Python虚拟机按以下方式执行。

    1.设置GIL

    2切换到一个线程去运行。

    3.运行指定数量的字节码的指令,或者线程主动让出控制(可以调用time.sleep())

    4.把线程设置为睡眠状态

    5.解锁GIL

    6.再次重复以上所有步骤。

退出线程

    当一个线程结束计算,它就退出了。线程可以通过调用thread.exit()之类的退出函数,也可以使用Python退出

进程的标准方法,如sys.exit()抛出一个systemExit()异常等。不过,你不可以直接杀掉一个线程。

主线程应该是一个好的管理者,它要了解每个线程都要做些什么事,线程都需要什么数据和什么参数,以及在

线程结束的时候,它们都提供了什么结果。这样,主线程就可以把各个线程的结果组合成一个有意义的的最后

结果。

    Python提供了几个用于多线程模编程的模块:
1).thread: 基本的,低级别的线程模块

2).threading:高级别的线程和同步对象

3).Queue:供多线程使用的同步先进先出(FIFO)队列

4).mutex:互斥对象

5).SocketServer:具有线程控制的TCP和UDP管理器

      Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许

程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强的线程

管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。

    避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块

里的属性有可能会与threading出现冲突;其次低级别的thread模块的同步原语很少(实际上只有一个),而threading

模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的

清除工作,至少threading模块能确保重要的子线程退出后进程才退出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: