线程编程(Thread)
线程基本概念
-
什么是线程
【1】 线程被称为轻量级的进程
【2】 线程也可以使用计算机多核资源,是多任务编程方式
【3】 线程是系统分配内核的最小单元
【4】 线程可以理解为进程的分支任务 -
线程特征
【1】 一个进程中可以包含多个线程
【2】 线程也是一个运行行为,消耗计算机资源
【3】 一个进程中的所有线程共享这个进程的资源
【4】 多个线程之间的运行互不影响各自运行
【5】 线程的创建和销毁消耗资源远小于进程
【6】 各个线程也有自己的ID等特征
threading模块创建线程
【1】 创建线程对象
from threading import Thread
t = Thread()
功能:创建线程对象
参数:target 绑定线程函数
args 元组 给线程函数位置传参
kwargs 字典 给线程函数键值传参
【2】 启动线程
t.start()
【3】 回收线程
t.join([timeout])
【4】代码示例
"""
线程示例
"""
import threading
from time import sleep
import os
a = 1
# 线程函数
def music():
global a
print("a = ",a)
a = 10000
for i in range(5):
sleep(2)
print(os.getpid(),"播放心如止水")
# 创建线程对象
t = threading.Thread(target=music)
t.start()
# 主线程任务
for i in range(3):
sleep(3)
print(os.getpid(),"播放跳舞吧")
t.join() # 回收线程
print("Main thread a:",a)
# 含有参数的线程函数
def fun(sec,name):
print("线程函数传参")
sleep(sec)
print("%s 线程执行完毕"%name)
# 创建多个线程
jobs = []
for i in range(5):
t = Thread(target = fun,args=(2,),
kwargs={'name':'T%d'%i})
jobs.append(t)
t.start()
for i in jobs:
i.join()
线程对象属性
t.name 线程名称
t.setName() 设置线程名称
t.getName() 获取线程名称
t.is_alive() 查看线程是否在生命周期
t.daemon 设置主线程和分支线程的退出关系
t.setDaemon() 设置daemon属性值
t.isDaemon() 查看daemon属性值daemon为True时主线程退出分支线程也退出。要在start前设置,通常不和join一起使用。
from threading import Thread
from time import sleep
def fun():
sleep(3)
print("线程属性测试")
t = Thread(target=fun,name = "Tarena")
# 主线程退出分支线程也退出
t.setDaemon(True)
t.start()
# 线程名称
t.setName("Tedu")
print("Thread name:",t.getName())
# 线程生命周期
print("is alive:",t.is_alive())
自定义线程类
-
创建步骤
【1】 继承Thread类
【2】 重写__init__方法添加自己的属性,使用super加载父类属性
【3】 重写run方法 -
使用方法
【1】 实例化对象
【2】 调用start自动执行run方法
【3】 调用join回收线程
from threading import Thread
from time import sleep,ctime
class MyThread(Thread):
def __init__(self,target = None,args=(),
kwargs = {},name="Tedu"):
super().__init__()
self.target = target
self.args = args
self.kwargs = kwargs
self.name = name
def run(self):
self.target(*self.args,**self.kwargs)
# **********************************
# 通过完成上面的MyThread类让整个程序可以正常执行
# 当调用start时player作为一个线程功能函数运行
# 注意,函数的名称和参数并不确定,player只是测试函数
# ***************************
def player(sec,song):
for i in range(2):
print("Playing %s:%s"%(song,ctime()))
sleep(sec)
t = MyThread(target = player,args = (3,),
kwargs={'song':'凉凉'},name = 'happy')
t.start()
t.join()