线程编程(Thread)
1.线程基本概念
- 线程称为轻量级的进程
- 线程也可以使用计算机多核资源,是多任务编程方式
- 线程是系统分配内核的最小单元
- 线程可以理解为进程的分支任务
2.线程特征
- 一个进程中可以包含多个线程
- 线程也是一个运行行为,消耗计算机资源
- 一个进程中的所有线程共享这个进程的资源
- 多个线程之间的运行互不影响各自运行
- 线程的创建和销毁消耗资源远小于进程
- 各个线程也有自己的ID等特征
3.threading模块
3.1无参
import threading
from time import sleep
def task():
for i in range(3):
sleep(2)
print("任务")
t=threading.Thread(target=task)
t.start()
t.join()
3.2传参使用
from threading import Thread
from time import sleep
def fun(sec,name):
print("线程函数")
sleep(sec)
print("%s执行完毕"%name)
jobs=[]
for i in range(3):
t=Thread(target=fun,args=(2,),kwargs={'name':'T%d'%i})
jobs.append(t)
t.start()
for i in jobs:
i.join()
4.线程对象属性
- t.name 线程名称
- t.setName()设置线程名称
- t.getName()获取线程名称
- t.is_alive()查看线程是否在生命周期
- t.daemon设置主线程和分支线程的退出关系
- t.setDaemon()设置daemon属性值
- t.isDaemon()查看daemon属性值
注:daemon为True时主线程退出分支线程也退出。要在start前设置,通常不和join一起使用
5.线程属性使用
5.1 线程的名字(name )
from threading import Thread
from time import sleep
import time
def fun():
sleep(3)
print("线程属性测试")
5.2 setDaemon(主线和子线退出关系)
from threading import Thread
from time import sleep
import time
def fun():
sleep(3)
print("线程属性测试")
t=Thread(target=fun)
t.start()
print("daemon",t.isDaemon())
6.自定义线程
使用于复杂场景 1.创建步骤 继承Thread类 重写__init__方法添加自己的属性,使用super加载父类属性 重写run方法 2.使用方法 实例化对象 调用start自动执行run方法 调用join回收线程
from threading import Thread
class ThreadClass(Thread):
def __init__(self,*args,**kwargs):
self.attr=args[0]
super().__init__()
def f1(self):
print("step 1")
def f2(self):
print("step 2")
def run(self):
self.f1()
self.f2()
t=ThreadClass('abc')
t.start()
t.join()
from threading import Thread
from time import sleep,ctime
class MyThread(Thread):
def __init__(self,target=None,args=(),kwargs={}):
super().__init__()
self.target=target
self.args=args
self.kwargs=kwargs
def run(self):
self.target(*self.args,**self.kwargs)
def player(sec,song):
for i in range(3):
print("Playing %s:%s"%(song,ctime()))
sleep(sec)
t=MyThread(target=player,args=(3,),kwargs={'song':'凉'})
t.start()
t.join()
|