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

在这里插入图片描述

这是通过继承方法实现的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值