-
线程
什么是线程
线程是一种多任务编程方法,可以利用计算机多核资源完成程序的并发执行,线程又被称为轻量级的进程
线程特征
*线程是计算机多核分配的最小单位
*一个进程可以包含多个线程
*线程也是一个运行的过程,消耗计算机资源,多个线程共享进程的资源和空间
*线程的创建删除消耗的资源都要远远小于进程
*多个进程之间执行互不干扰
*线程也有自己的特有属性,比如指令级 ID
threading 模块创建线程
threading.Thread()
功能:创建线程对象
参数:name 线程名称 默认为Thread-1
target 线程函数
args 元组 给线程函数位置传参
kwargs 字典 给线程函数键值传参
t.start() 启动线程 自动运行线程函数
t.join([timeout]) 回收线程
线程对象属性
t.is_alive() 查看线程状态
t.name() 线程名称
t.setName() 设置线程名称
t.getName() 获取线程名称
threading.currentThread() 获取当年线程对象
t.daemon属性
默认情况下主线程退出不会影响分支线程执行
如果设置为True 则分支线程随主线程退出
设置方法:
t.daenon = True
t.setDaemon(True)
判断属性值
t.isDaemon
创建自己的线程类
步骤:
1. 继承Thread
2. 加载Thread中的__init__
3. 重写run方法
# mythread.py
from threading import Thread
from time import sleep, ctime
class myTread(Thread):
def __init__(self, func , args = [], kwargs = {}):
super().__init__()
self.kwargs = kwargs
self.func = func
self.args = args
def run(self):
self.target(*self.args, **self.kwargs)
def player(song, sec):
for i in range(2):
print('Playing %s %s' % (song, ctime()))
sleep(sec)
t =Thread(target = myTread.run, args = ('凉凉',),\
kwargs = {'sec' : 2})
t.start()
t.join()
线程通信
通信方法:多个线程共享的空间,所以线程间通信使用全局变量来完成
注意事项:线程间使用全局变量往往要同步互斥机制保证通信安全
线程的同步互斥方法
线程的event
e = threading.Event() 创建事件对象
e.wait([timeout]) 如果e为设置状态则不阻塞否则阻塞
e.set()将e变为设置状态
e.clear()清除设置
线程锁
lock = threading.lock() # 创建锁对象
lock.acquire() 上锁
lock.release() 解锁
*也可以通过with 上锁 ,上锁状态调用acquire会阻塞
python 线程的GIT问题 (全局解释器锁)
python--->支持多线程-->同步和互斥-->加锁-->超级锁,给解释器加锁
-->解释器同一时刻只能解释一个线程
后果:一个解释器同一时刻只能解释执行一个线程,所以导致python线程效率地下,
但是当遇到IO阻塞时,线程会主动让出解释器,因此python线程更加适合高
延迟的IO程序线程
解决方法
*尽量用进程完成并发
*不使用c解释器 c# java
*尽量使用多种方案组合的方法进行并发操作,线程用作高延迟IO