python多线程技术(一)
最近一直在学习python的当中多线程技术,感觉使用起来的确比java要方便多~正好乘这个机会,当作是一个记录和总结了
多线程技术概述
1.进程与线程
- 进程:正在运行中的程序
- 线程:进程中负责程序执行的控制单元(执行路径)一个进程可以有多个执行路径,称之为多线程
2.多线程技术的意义
开启多个线程是为了同时运行多部分代码,每一个线程都有自己运行的内容。这个内容就是多线程要执行的任务
3.多线程的好处与弊端
好处:解决了多部分程序同时运行的问题,由主机的操作系统给每个进程/线程安排一个小的时间片,
在所有进程/线程间快速循环,使得每个执行单位都得到CPU的执行时间。
弊端:线程太多反而会导致cpu处理效率的降低,这是因为应用程序的执行都是cpu做着快速的切换完成的,而这个切换是随机的。
4.python中多线程局限性(这里的python如不加特殊说明都是指CPython)
Python解释器内部使用了全局解释器锁(GIL),限制了一个Python程序只能在一个CPU核心上运行。
所以…某种以上上…python语言的多线程特性…只是一个美丽的谎言…但这并不足以作为拒绝learning的理由,君不见node.js的异步单线程模型在大部分应用场合下~速度不都是杠杠滴嘛
创建多线程的方式
python当中封装了有专门针对多线程解决方案的threading模块,我们对于多线程技术的各种功能需求,都可以在此模块当中找到,挑几个重要的介绍下吧~
类名 | 功能描述 |
---|---|
Thread | 表示控制线程的类,封装线程对象一般属性和开启以及等待方法 |
Lock | 指令锁,封装由同步所需的获取🔒和释放锁的方法 |
RLock | 可重入锁,用于同一线程多次获取同一资源,相应地也要release匹配 |
Condition | 条件变量,常用于生产者,消费者模型中的共享变量控制及线程间的通信 |
Semaphore | 信号量,内部维护着一个计数器,可用于实现对稀缺资源的控制,如数据库连接池等 |
Event | 事件,用于 |
在python中有两种方式创建线程,以下来自Thread类doc说明
There are two ways to specify the activity: by passing a callable object to the constructor, or by overriding the run() method in a subclass
下面先介绍下Thread对象相关属性和方法,以及线程的创建方式
第一种方式:继承Thread类并重写run()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class MyThread(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
s = 0
for i in range(30):
s += i;
time.sleep(0.1)
print(s)
th = MyThread()第二种方式:在实例化Thread对象时传入线程的运行目标任务(一个函数)
1
2
3
4
5
6
7
8def thfun():
s = 0
for i in range(30):
s += i;
time.sleep(0.1)
print(s)
th = threading.Thread(target=thfun)
创建线程后即可调用 start()方法调用开启线程
1 | th.start() |
多线程的运行状态
引用某大佬的一幅图来解释吧,在此先膜拜下大佬~
其它
受篇幅限制,本次关于python下多线程技术就暂且聊到这里了,太长的文章想必大佬们也没耐心看下去…相信这里的内容对任何有一定语言基础的朋友来说都是再容易不过了🤓~接下来的博主要更新的文章将是多线程技术中的核心与精华(不限语言),暂且剧透下吧😈:指令锁实现同步、条件变量模拟生产者消费者模型、信号量实现对稀缺资源的控制、使用事件实现线程间的通信…敬请期待,预计1~2篇,下次我会po上全部完整代码😎