python之线程和进程

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.继承之方法
在这里插入图片描述

在这里插入图片描述

这是通过继承方法实现的

猜你喜欢

转载自blog.csdn.net/weixin_42719822/article/details/82718542