線程中的鎖以及線程池

#一.鎖#   線程安全:多線程操做時,內部會讓全部的線程排隊處理(列表,字典,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()#
相關文章
相關標籤/搜索