线程
线程:
1、线程也是多任务编程的一种方法,可以使用计算机多核资源。是计算机核心分配的最小单、位
2、线程又称为轻量级的进程,在创建和删除时消耗的计算机资源小
线程和进程的关系:
1、一个进程中可以包含多个线程
2、进程中的所有线程,共享进程的空间资源(空间,全局变量,分配的内存等)
3、线程也有自己的特有属性,比如 指令集 TID等
创建线程
import threading
threading.Tread
Thread()
功能:创建线程
参数:target 线程函数
args 元组 给线程函数位置传参
kwargs 字典 给线程函数字典传参
name 给线程取名字(默认Thread-1)
返回:线程对象
t.start() 启动线程
t.join(timeout) 回收线程
t.is_alive() 查看线程状态
t.name 查看线程名称
threading.currentThread() 得到线程对象
t.setName()设置线程名称
t.daemon 属性
默认 为false 主线程执行完毕,不会影响分支线程的执行
如果设置为True,则主线执行完毕,其他线程也会终止
t.isDaemon():判断daemon属性是true or false
t.daemon=True
t.setDaemon(True)
import threading from time import sleep #线程函数 def music(): while True: sleep(3) print("线程播放") 关联创建线程和函数MUSIC# t=threading.Thread(target=music) t.start() while True: sleep(2) print('主线程播放') #等待回收线程 t.join()
from threading import Thread,currentThread from time import sleep def fun(sec): print("线程属性测试") sleep(sec) print("%s线程结束"%currentThread().getName()) thread=[] for i in range(3): t=Thread(name="t"+str(i),target=fun,args=(3,)) t.start() thread.append(t) for i in thread: print("thread name :",i.name) print("alive:",i.is_alive()) i.join()
yangrui@ubuntu:~/num6$ python3 thread2.py
线程属性测试
线程属性测试
线程属性测试
thread name : tedu0
alive: True
tedu0线程结束
thread name : tedu1
alive: True
tedu1线程结束
tedu2线程结束
thread name : tedu2
alive: False
线程的通信;
通过全局变量进行通信
进程和线程的区别和联系:
1、两者都是多任务编程方式,均可使用计算机的多核
2、进程的创建要比线程消耗更多的资源
3、进程空间独立,数据安全性更好操作,有专门的进程间通信方式
4、线程使用全局变量通信,往往要和同步互斥机制配合,防止产生资源的争夺
5、一个进程可以包含多个线程,线程共享进程资源
6、进程线程都有自己的特有资源。
使用场景:
需要创建较多的并发,任务比较简单,线程比较合适;
如果程序数据资源使用重叠较多,要考虑到线程锁是否需要更复杂的逻辑;
如果多个任务并无什么关联性,不易用多线程,将其融入到一个进程中;
(python线程并不使用用计算密集型并发)
线程中同步互斥方法:
Event 线程事件
e=Event()
e.wait() e.set() e.clear()
Lock 线程锁
lock=Lock() 创建锁
lock.acquire()加锁
lock.release()解锁