#一.鎖# 線程安全:多線程操做時,內部會讓全部的線程排隊處理(列表,字典,queue)# 線程不安全+鎖=>排隊處理#1.lock(鎖一段區域)一次放行一個# 需求# 把本身添加到列表中# 讀取列表的最後一個值# import threading# import time# v=[]# def func(arg):# v.append(arg)# time.sleep(0.01)# m=v[-1]# print(arg,m)# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# 1 9# 3 9# 0 9# 2 9# 5 9# 4 9# 7 9# 6 9# 8 9# 9 9# import threading# import time# v=[]# lock=threading.Lock()# def func(arg):# lock.acquire() #得到鎖# v.append(arg)# time.sleep(0.01)# m=v[-1]# lock.release() #釋放鎖# print(arg,m)# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# 0 0# 1 1# 2 2# 3 3# 4 4# 5 5# 6 6# 7 7# 8 8# 9 9#2.RLock(與Lock用法相同,可是Lock不支持鎖屢次解屢次,RLock支持)一次放行一個# import threading# import time# v=[]# lock=threading.RLock()# def func(arg):# lock.acquire()# lock.acquire()# v.append(arg)# time.sleep(0.01)# m=v[-1]# lock.release()# lock.release()# print(arg,m)# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()#3.BoundedSemaphort(一次放n個)信號量# import threading# import time# lock=threading.BoundedSemaphore(3) #能夠有三個線程同時經過鎖# def func(arg):# lock.acquire()# print(arg)# time.sleep(2)# lock.release()## for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()#4.Condition(一次放不定數量個,由用戶動態指定)# 用法一:# import threading# import time# lock=threading.Condition()# def func(arg):# print('線程進來了')# lock.acquire() #也須要acquire和release# lock.wait() #在wait處加鎖# print(arg)# lock.release()## for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# while 1:# inp=int(input('請輸入須要輸出的數量:'))# lock.acquire() #如下三行必需要有# lock.notify(inp)# lock.release()# 用法二:# import threading# lock=threading.Condition()# def xxx():# print('來執行函數了')# return input('>>>')# def func(arg):# print('線程進來了')# lock.wait_for(xxx) #鎖住了,等括號中的 xxx成立了,再釋放鎖# print(arg)# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()#5.Event(一次放全部)# import threading# import time# lock=threading.Event() #能夠有三個線程同時經過鎖# def func(arg):# print('線程來了')# lock.wait() #加鎖# print(arg)# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# input('>>>')# lock.set() #遇到這句就全部的都放過去了,此時的lock.wait變成了釋放鎖的狀態# lock.clear() #lock.wait又變成了加鎖的狀態## for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# time.sleep(3)# input('>>>>')# lock.set() #再次釋放鎖#6.threading.local# import threading# import time# v=threading.local()# def func(arg):# #內部會爲當前線程建立一個空間用於存儲# v.phone=arg# time.sleep(2)# print(v.phone,arg)## for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# import threading# import time## DATA_DICT={}# v=threading.local()# def func(arg):# # c=threading.current_thread()# # print(c,arg)# v=threading.get_ident()# DATA_DICT[v]=arg# # print(v,arg)## time.sleep(1)# print(DATA_DICT[v],arg)# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()#原理:#內部會爲每一個線程建立一個空間(字典),用於當前線程存取屬於本身的值,保證線程之間的數據隔離# import threading# import time# INFO={}# class Local(object):# # def __getattr__(self, item):# # ident=threading.get_ident()# # return [ident][item]# def __setattr__(self, key, value):# ident=threading.get_ident()# if ident in INFO:# INFO[ident][key]=value# else:# INFO[ident]={key:value}# INFO[ident]['mi'] = 10# obj=Local()# def func(arg):# obj.phone=arg# for i in range(10):# t=threading.Thread(target=func,args=(i,))# t.start()# print(INFO)# 獲得的結果# INFO={# 1111:{# 'phone':0,# 'mi':10# },# 2222:{# 'phone':0,# 'mi':10# },# 3333:{# 'phone':0,# 'mi':10# }# }#7.線程池(用於控制現成的數量,由於不是越多越好,效率隨着)# from concurrent.futures import ThreadPoolExecutor# import time# def task(a1,a2):# time.sleep(1)# print(a1+a2)# pool=ThreadPoolExecutor(5) #最多隻有五個線程在工做## for i in range(40):# # 去線程池中申請一個線程,讓線程執行task函數# pool.submit(task,i,i+1)#8.生產者消費者模型# import queue# # q=queue.Queue() #線程安全# # q.put(1)# # q.put(2)# # q.put(3)# # q.put(4)# # print(q.get()) #1# 生產者模型解決了一直等待的問題# import time# import threading# import queue# q=queue.Queue() #線程安全# def producer(id):# '''# 生產者# :return:# '''# while 1:# time.sleep(1)# q.put('包子')# print('廚師%s 生產了一個包子' % id)# for i in range(1,3):# t=threading.Thread(target=producer,args=(i,))# t.start()# def consumer(id):# '''# 生產者# :return:# '''# while 1:# time.sleep(2)# q.get()# print('顧客 %s 吃了一個包子' % id)### for i in range(1,4):# t1=threading.Thread(target=consumer,args=(i,))# t1.start()#