1.创建线程
–线程
–进程
—一个进程里面必定会有一个主线程
python线程的模块
2._thread 模块中创建多线程
import _thread
import threading
import time
def job(name):
print(“这是一个需要执行的任务”)
# # 激活的线程个数
# print(“当前线程的个数:”, threading.active_count())
# # 打印当前线程的详细信息
# print(“当前线程信息:”, threading.current_thread())
print(name, time.ctime())
time.sleep(2)
if name == “main”:
# 创建多个线程, 但是没有开始执行任务;
_thread.start_new_thread(job,(‘thread1’, ))
_thread.start_new_thread(job,(‘thread2’, ))
while True:
pass
结果:thread1 2018-09-15 thread2 2018-09-15
3._threading创建线程方法·
通过实例化对象创建多线程
这里可以添加 t2, 用相同的方法,那么会有三个进程,进程的名称为job1
注意:target后是函数名,name后是进程名称,而args后则是要传的参数。
4.不使用多线程
很明显,如果不使用多线程那么线程就会排序执行,依次完成,所以总共会花费4.5秒时间,这是很浪费时间的。
5.多线程的join方法
前面的不变
if name=’main’:
start_time=time.time( )
t1=threading.Thread(target=music,args=(‘有点甜’,) )
t2=threading.Thread(target=music,args=(‘有点甜’,) )
t1.start()
t2.start()
# 等待所有的子线程执行结束之后, 继续执行主线程的内容;
t1.join()
t2.join()
print("花费时间: %s" %(time.time()-start_time))
执行如下
这样的话,就可以多个线程同时进行,总时间为时间长的进
程就是三秒。
注意:在此处的.join( )方法目的是阻塞主线程,使线程结束后才执行主线程,去掉的话如下:
6.整理join的详细理解
返回结果为 job job main ,停一秒输出一次job 。
7.线程同步之线程锁
为什么会需要线程锁
多个线程对同一个数据进行修改时,可能出现不可预料的情况
如何添加线程锁
因为遇到数量庞大的计算时会出现错误,所以添加线程锁
返回结果
添加锁子之后,计算无误差
8.GIL全局解释器锁
python使用多线程 , 是个好主意么? 为什么?
- GIL(全局解释器锁)
- python解释器默认每次只允许一个线程执行
执行过程:
1). 设置GIL
2). 切换到线程去运行对应的任务;
3). 运行
- 执行完了
- time.sleep()
- 获取其他信息才能继续执行, eg: 从网络上获取网页信息等;
3. 把线程设置为睡眠状态
4. 解锁GIL
5.再次重复执行上述内容;
python解释器:Cpython解释器, Jpython解释器, p-python解释器
方法的选择:
Python并不支持真正意义上的多线程。Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,
使用多线程包并不是个好主意。Python中有一个被称为Global Interpreter Lock(GIL)的东西,
它会确保任何时候你的多个线程中,只有一个被执行。线程的执行速度非常之快,会让你误以为线程是并行执行的,
但是实际上都是轮流执行。经过GIL这一道关卡处理,会增加执行的开销。这意味着,如果你想提高代码的运行速度,
使用threading包并不是一个很好的方法。
# I/O密集型操作: 多线程操作
# CPU/计算密集型:
“”"
实验如图
此处的装饰器如下
运行结果如下
这里我们发现,多线程在python解释器中速度是比较慢的。
9.threading的set_daemon方法实现
当主线程执行结束,让没有执行的线程强制结束;set_ daemon
这里主线程执行非常快
10.队列与多线程
1). 理论上多线程执行任务, 会产生一些数据, 为其他程序执行作铺垫;
2). 多线程是不能返回任务执行结果的, 因此需要一个容器来存储多线程产生的数据
3). 这个容器如何选择? list(栈, 队列), tuple(x), set(x), dict(x), 此处选择队列来实现
11. threading的创建线程方法 —任务无需任何参数
12.线程中的两个方法(重中之重)
1.实例化方法
这是通过实例化完成的
用线程的方法控制程序进行
2.继承之方法
这是通过继承方法实现的