栈
先入后出
也是用queue模块实现
先入后出的对列(栈)
声明格式:
# 创建一个栈
q = queue.LeftQueue()
# 进栈
q.put()
# 出栈
q.get()
生产者与消费者模式
在并发编程中使用生产者和消费者模式能够解决绝大多数的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度
例:
import threading
import queue
num = 0
# 生产者
def func1(name):
global num
num += 1
print(f"{name}完成{num}号包子")
q.put(f"{num}号包子")
# 消费者
def func2(name):
res = q.get()
print(f"{name}获取了{res}号包子")
if __name__ == ' main ':
# 创建了一个队列
q = queue.Queue()
# 创建两个线程
t1 = threading.Thread(target=func1, args=("王大厨",))
t2 = threading.Thread(target=func1, args=("小王",))
t1.start()
t2.start()
消费者就是消耗数据的进程
生产者就是生产数据的进程
什么是生产者与消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者之间的强耦合问题,生产者和消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列相当于一个缓冲区,平衡了生产者和消费者的处理能力。
为什么使用生产者和消费者模式
在多线程中如果生产者生产是数据过快而消费者消耗数据的速度很慢,就会出现供大于求的现象发生,生产者就要等待消费者消耗数据才可以继续生产,若消费者消耗数据的速度过快,而生产者跟不上消耗的速度就会出现供不应求的现象发生,而这时消费者就需要等待生产者,为了解决这个问题于是引入了生产者和消费者模式。
threadingLocal
threadingLocal相当于为每一个线程绑定了一个数据库,每个线程可以通过访问自己的数据库来得到自己想要的数据,解决了参数在一个线程中各个函数之间互相传递的问题。
例: