一、定义:
线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是执行单位
二、线程定义方式:
1、使用替换threading模块提供的Thread
from threading import Thread from multiprocessing import Process def task(): print('is running') if __name__ == '__main__': t=Thread(target=task,) # t=Process(target=task,) t.start() print('主')
2、自定义类,继承Thread
from threading import Thread from multiprocessing import Process class MyThread(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s is running' %self.name) if __name__ == '__main__': t=MyThread('egon') # t=Process(target=task,) t.start() print('主')
三、多线程共享同一个进程内的资源
因为线程间的数据是共享的所以都会用同一个资源
from threading import Thread from multiprocessing import Process n=100 def work(): global n n=0 if __name__ == '__main__': # p=Process(target=work,) # p.start() # p.join() # print('主',n) t=Thread(target=work,) t.start() t.join() print('主',n)
四、其它相关函数
Thread实例对象的方法 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。 threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
from threading import Thread,activeCount,enumerate,current_thread import time def task(): print('%s is running' %current_thread().getName()) time.sleep(2) if __name__ == '__main__': t=Thread(target=task,) t.start() t.join() print(t.is_alive()) print(t.getName()) print(enumerate()) print('主') print(activeCount())
current_thread的用法 from threading import Thread,activeCount,enumerate,current_thread from multiprocessing import Process import time def task(): print('%s is running' %current_thread().getName()) time.sleep(2) if __name__ == '__main__': p=Process(target=task) p.start() print(current_thread())
from threading import Thread,activeCount,enumerate,current_thread from multiprocessing import Process import time def task(): print('%s is running' %current_thread().getName()) time.sleep(2) if __name__ == '__main__': t1=Thread(target=task) t2=Thread(target=task) t3=Thread(target=task) t1.start() t2.start() t3.start() print(current_thread())
五、守护线程
守护线程则是主线程等待其它非守护线程结束,主线程结束则守护线程结束
#再看:守护线程 from threading import Thread import time def task1(): print('123') time.sleep(10) print('123done') def task2(): print('456') time.sleep(1) print('456done') if __name__ == '__main__': t1=Thread(target=task1) t2=Thread(target=task2) t1.daemon=True t1.start() t2.start() print('主')
六、线程互斥锁
即:线程中谁抢到了锁谁去执行,没有抢到的则在等待
from threading import Thread,Lock import time n=100 def work(): global n mutex.acquire()#抢到锁加锁 temp=n time.sleep(0.1) n=temp-1 mutex.release()#解锁 if __name__ == '__main__': mutex=Lock() l=[] start=time.time() for i in range(100): t=Thread(target=work) l.append(t) t.start() for t in l: t.join() print('run time:%s value:%s' %(time.time()-start,n))
七:互斥锁与join的区别
互斥锁只是在重要的代码阶段加上谁抢到谁处理,而join则是一个一个的全部把所有的代码都执行,大大加大执行代码的时间
join实例:
from threading import Thread,Lock import time n=100 def work(): time.sleep(0.05) global n temp=n time.sleep(0.1) n=temp-1 if __name__ == '__main__': start=time.time() for i in range(100): t=Thread(target=work) t.start() t.join() print('run time:%s value:%s' %(time.time()-start,n))
互斥锁实例:
#互斥锁 from threading import Thread,Lock import time n=100 def work(): time.sleep(0.05) global n mutex.acquire() temp=n time.sleep(0.1) n=temp-1 mutex.release() if __name__ == '__main__': mutex=Lock() l=[] start=time.time() for i in range(100): t=Thread(target=work) l.append(t) t.start() for t in l: t.join() print('run time:%s value:%s' %(time.time()-start,n))
八:线程死锁与递规锁
死锁:则是几个人在抢几把锁,但是一个人抢一把锁,在没有解这把锁,则是去抢另一把,则永远无法抢到,也没法解除当前的锁,由为死锁
from threading import Thread,Lock,RLock import time mutexA=Lock() mutexB=Lock() class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('