一,开启线程的两种方式
方法一:
from threading import Thread import random,time def eat(name): print('%s is eating......'%name) time.sleep(random.randint(1,5)) print('%s had end....'%name) if __name__ == '__main__': t=Thread(target=eat,args=('xiaoming',))#创建线程 t.start() #开启线程 print('主线程')
方法二:
from threading import Thread import random,time class Eat(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s is eating......' % self.name) time.sleep(random.randint(6, 15)) print('%s had end....' % self.name) if __name__ == '__main__': t=Eat('xiaoming') t.start() print('主线程')
二,线程相关的其他方法
Thread实例对象的方法 # isAlive(): 返回线程是否活动的。 # getName(): 返回线程名。 # setName(): 设置线程名。 threading模块提供的一些方法: # threading.currentThread(): 返回当前的线程变量。 # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
三,守护线程
设置一个线程为守护线程,那么它会等本进程中所有非守护线程运行结束之后才会被主线程给回收,而守护进程会在父进程代码运行完毕
的时候就会被回收。
from threading import Thread,currentThread import time def talk1(): print('%s is running'%currentThread().getName()) time.sleep(3) print('%s is end'%currentThread().getName()) def talk2(): print('%s is running'%currentThread().getName()) time.sleep(3) print('%s is end'%currentThread().getName()) if __name__ == '__main__': t1=Thread(target=talk1) t2=Thread(target=talk2) t1.daemon=True #设置守护线程 t1.start() t2.start() print('主线程')
四,同步锁
1.线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock仍然没有被释放则阻塞,即便是拿到执行权限GIL也要立刻交出来
2.join是等待所有,即整体串行,而锁只是锁住修改共享数据的部分,即部分串行,要想保证数据安全的根本原理在于让并发变成串行,join与互斥锁都可以实现,毫无疑问,互斥锁的部分串行效率要更高

# from threading import Thread,Lock # import time # n=100 # def work(): # mutex.acquire() # global n # temp=n # time.sleep(0.1) # n=temp-1 # mutex.release() # if __name__ == '__main__': # mutex=Lock() # t_l=[] # for i in range(100): # t=Thread(target=work) # t_l.append(t) # t.start() # for t in t_l: # t.join() # print(n) from threading import Thread,Lock import time n=100 def work(): time.sleep(3) global n mutex.acquire() temp=n time.sleep(0.1) n=temp-1 mutex.release() if __name__ == '__main__': strat=time.time() mutex=Lock() t_l=[] for i in range(100): t=Thread(target=work) t_l.append(t) t.start() for t in t_l: t.join() stop=time.time() print(n) print('运行了:%s 秒'%(stop-strat))
五,死锁现象与递归锁
所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁

from threading import Thread,Lock import time mutexA=Lock() mutexB=Lock() class MyThread(Thread): def run(self): self.func1() self.func2() def func1(self): mutexA.acquire() print('