1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 多线程锁 线程池 消费者生产者模型

多线程锁 线程池 消费者生产者模型

时间:2022-07-27 01:49:09

相关推荐

多线程锁 线程池 消费者生产者模型

锁是怎么存在的?

在python建立之初,开发者目的是为了快速把语言开发出来,如果加上GIL(c语言加锁),切换时按照100条字节指令来进行线程间的切换

为什么加锁?

非线程安全,控制一段代码

1.lock = threading.BoundedSemaphore

一次可以限制关卡,限制通行次数,不过这个是写死的

1 import time 2 import threading 3 lock = threading.BoundedSemaphore(3)#一次放三个(一次只通行三个) 4 def func(arg): 5lock.acquire() 6time.sleep(1) 7print(arg) 8lock.release() 9 for i in range(20):10t = threading.Thread(target=func, args=(i,))11t.start()

2.

lock = threading.Condition()

一次可以限制关卡,限制通行次数,不过这个是写活的

可以自定义加载个数 ,只需在后面便利后加一个参数

lock.notify(inp) inp 来限制次数

1 lock = threading.Condition() 2 def func(arg): 3print('线程进来了') 4lock.acquire() 5lock.wait() # 加锁这个特殊需要等待参数传递 6print(arg) 7time.sleep(1) 8lock.release() 9 for i in range(10):10t =threading.Thread(target=func,args=(i,))11t.start()12 while True:13inp = int(input('>>>'))14lock.acquire()15lock.notify(inp)#加的控制次数的 这个是特殊的16lock.release()

3.

lock = threading.Event() 获取全部

注意.获取全部使用 lock.wait() 加锁的

input(">>>>") 是用来控制是否全部获取的一个开关,一旦输入 ,解锁会获取全部 后面需要加入 lock.set() 绿灯

如果想再次使用这个函数, lock.clear() 重新清空

1 import time 2 import threading 3 4 lock = threading.Event() 5 6 def func(arg): 7print('线程来了') 8lock.wait() # 加锁:红灯 9print(arg)10 for i in range(10):11t =threading.Thread(target=func,args=(i,))12t.start()13 input(">>>>")14 lock.set() # 绿灯15 lock.clear() # 再次变红灯16 for i in range(10):17t =threading.Thread(target=func,args=(i,))18t.start()19 input(">>>>")20 lock.set()

4.

v = threading.local()#内部创建一个属于自己的值 phone=arg 为了区分自己拿的包

1 import time 2 import threading 3 v = threading.local() 4 def func(arg): 5# 内部会为当前线程创建一个空间用于存储:phone=自己的值 6v.phone = arg 7time.sleep(2) 8print(v.phone,arg) # 去当前线程自己空间取值 9 for i in range(10):10t =threading.Thread(target=func,args=(i,))11t.start()

线程池: 用来约束每次输出的次数,不是全部哪出啊,可以限制一次拿出几个

1 from concurrent.futures import ThreadPoolExecutor2 import time3 def func(a1,a2):4time.sleep(5)5print(a1,a2)6 a=ThreadPoolExecutor(4)#实例化对象让其限制次数 7 for i in range(40):8a.submit(func,i,15)

生产者,消费者模型

这种模型在多线程中属于按顺序使用 现有生产才有消费,这个是一个固定顺序,而在函数中,为了更明确这种概念而不考虑生产时间限制

来更符合逻辑性 出现了queue 模块 首先实例化对象 q=queue.Queue 在用方法q.put(" ") 括号里面必须有字符串提示从这里入,符合队列(先进先出)而抛开逻辑

后面用q.get( ) 方法提示出来了

1 import time 2 import threading 3 import queue 4 q=queue.Queue()#实例化对象 5 def mk(id): 6while 1: 7 time.sleep(3) 8 q.put("布加迪")#首先进入q.put 9 print("师傅%s 生产了一个布加迪"% id)10 for i in range(1,3):11t=threading.Thread(target=mk,args=(i,))12t.start()13 def et(id):14while 1:15 time.sleep(1)16 v1=q.get()#然后冲进去17 print("连达%s 吃了一个布加迪"% id)18 for i in range(1,6):19t1=threading.Thread(target=et,args=(i,))20t1.start()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。