线程也是一种多任务编程的方式,可以使用计算机多核资源。线程又被称为轻量级的进程。
线程特征
* 线程是计算机核心分配的最小单位
* 一个进程可以包含多个线程
* 线程也是一个运行过程,也要消耗计算机资源。多个线程共享其进程的资源和空间
* 线程也拥有自己特有的资源属性,比如指令集,TID等
* 线程无论创建还是删除还是运行资源消耗都小于进程
* 多个线程之间并行执行,互不干扰
应用场景 :
* 需要创建较多的并发,任务比较简单,线程比较合适。
* 如果程序见数据资源使用重叠比较多,要考虑到线程锁是否需要更复杂的逻辑
* 如果多个任务并无什么关联性,不易用多线程将其融入到一个进程中
* python线程不适用于计算密集型并发
import threading
t = threading.Thread()
功能 : 创建线程对象
参数 : name 线程名称
target 线程函数
args 元组 给线程函数传参
kwargs 字典 给线程函数传参
t.start() 启动线程
t.join([timeout]) 回收线程
t.is_alive() 查看线程状态
t.name 线程名称 默认Thread-1 。。。。。
t.setName() 设置线程名称
threading.currentThread() 获取当前线程对象
t.daemon
默认情况下,主线的结束不会影响分支线程
如果设置为True 则主线程退出分支线程也会退出
设置方法:
t.daemon = True
t.setDaemon(True)
判断daemon属性:
t.isDaemon()
说明:
线程daemon属性的设置在start前
一般设置daemon后不会在使用join
a、继承Thread类
b、运行Thread类中的__init__方法以获取父类属性
c、重写run方法
threadpool 第三方库,线程池应用较少,用的最多的是进程池。
python线程之GIL(全局解释器锁):python ---》 支持多线程 ---》同步互斥 ---》加锁 ---》 超级锁 ----》 在同一时刻,解释器只能解释一个线程 -----》大量python库为了省事沿用了这种方法 ---》python 多线程效率低下
GIL 问题 : 由于python的全局解释器锁造成python的多线程执行效率低下
import threading
from time import sleep
import os
a = 1
#线程函数
def music():
global a
a = 10000
for i in range(5):
sleep(2)
print("播放葫芦娃",os.getpid())
#创建线程对象
t = threading.Thread(target = music)
t.start()
for i in range(5):
sleep(1.5)
print("想听扶摇",os.getpid())
t.join()
print("a = ",a)
from threading import Thread,currentThread
from time import sleep
#线程函数
def fun(sec):
print("线程属性测试")
sleep(sec)
#获取线程对象 getName()获取名字
print("%s 线程结束"%currentThread().getName())
thread = []
for i in range(3):
t = Thread(target = fun,name = "tedu%d"%i,\
args = (3,))
thread.append(t)
t.start()
print(t.is_alive()) #查看进程状态
thread[1].setName('Tarena') #设置线程名称
print(thread[2].name) #获取线程名称
#回收线程
for i in thread:
i.join()
#daemon属性
from threading import Thread
from time import sleep
def fun():
print("Daemon 属性测试")
sleep(5)
print("线程结束")
t = Thread(target = fun)
#为线程设置名字
t.setName("tedu")
#daemon属性设置为True
#t.daemon = True
t.setDaemon(True)
print(t.isDaemon())
t.start()
t.join(2)
print("=====主线程结束======")
from threading import Thread
from time import ctime,sleep
#创建自己的线程类
class MyThread(Thread):
def __init__(self,target,\
name = "Tedu",args = (),kwargs = {}):
super().__init__()
self.name = name
self.target = target
self.args = args
self.kwargs = kwargs
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 = MyThread(target = player,args = ('凉凉',3))
#自动执行run()
t.start()
t.join()
人工智能(PythonNet)—— 目录汇总