大家好,欢迎来到IT知识分享网。
一直懒得写Python相关的文章,恰好有天需要简单的给童鞋们讲点课,仓促之余就诞生了此文.
今天本来准备全面的聊聊有关高性能并发这个话题来着,但是周末马上要来了啊.所以我就取了其中的一点来介绍,关于其他的方面,有兴趣的小伙伴可以和我交流.谈高效并发,往往脱离不了以下三种方案:
- 进程:每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他控制流通信必须依靠显示的进程间通信,即我们所说的IPC机制
- 线程:线程应该是我们最为熟知的.它本质是运行在一个单一进程上下文中的逻辑流,由内核进行调度.
- I/O多路复用:应用程序在一个进程的上下文中显式地调度他们自己的逻辑流.逻辑流被模型化为状态机,数据到达文件描述符之后,主程序显式地从一个状态转换为另一个状态.因为程序都是以一个单独的进程,所以所有的流都共享同一个地址空间.基本的思路就是使用select函数要求内核挂起进程,只有一个或多个I/O事件发生后,才将控制权返回给应用程序
看起来令人难以理解,但幸运的是Python中针对这三方面都提供了响应的支持,简化了我们的操作.那今天咱就聊聊其中的一点–线程.为什么选择线程呢?一方面考虑到大部分人都有线程这个概念,另一方面考虑相比进程线程更轻量级,相比协程,线程更易于理解.进程和线程之间的关系可以用衣服最简单的图来表示:
线程的状态
任何一门支持线程的语言都可以具备以下几种运行状态,无论是你做Java,Python还是C,首先来看下面一张图:
在这里我简单来解释以下这几种状态的含义:
- 新建:使用线程的第一步就是创建线程,创建后的线程只是进入可执行的状态,也就是Runnable
- Runnable:进入此状态的线程还并未开始运行,一旦CPU分配时间片给这个线程后,该线程才正式的开始运行
- Running:线程正式开始运行,在运行过程中线程可能会进入阻塞的状态,即Blocked
- Blocked:在该状态下,线程暂停运行,解除阻塞后,线程会进入Runnable状态,等待CPU再次分配时间片给它
- 结束:线程方法执行完毕或者因为异常终止返回
这就和人的一生,出生-学习(工作之前的准备)-工作-休假
其中最复杂的是线程从Running进入Blocked状态,通常有三种情况:
- 睡眠:线程主动调用sleep()或join()方法后.
- 等待:线程中调用wait()方法,此时需要有其他线程通过notify()方法来唤醒
- 同步:线程中获取线程锁,但是因为资源已经被其他线程占用时.
到现在,我们对线程有个基本的概念,光说不练假把式,下面我们就通过是三个小的示例来聊聊线程的使用以及线程中最终的两个概念:同步和通信.
线程简单使用
Python当中要实现多线程有两种方式:一种是使用低级的_thread模块,另一种高级threading模块,相比而言,我推荐使用threading模块..在开始之前呢,先来了解下threading模块给我提供哪些常用的类:
Thread,Lock,RLock,Condition,Event,Semaphore,Timer和Local.
这几个类可谓开发多线程中的神兵利器.但是介于篇幅,咱就不展开讲了.
我们直接来看如何使用多线程,这才是至关重要的,有句老话是这么说的:要想让小孩子跑得先让他学会走.我们这就走两步:
import threading
#具体做啥事,写在函数中
def run(number):
print(threading.currentThread().getName() + '\n')
print(number)
if
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27291.html