队列、生产消费模型.html

一、python 队列:

  • 概述:
    • import queue
    • 都是在python内存中创建,python进程退出,则队列清空
    • 可通过pycharm查看这些队列类的方法
  • 先进先出队列:
    • q = queun.Queue( [10] ) # 创建一个 "先进先出" 队列,最多接受10个数据,放第11个时会卡主,不加参数默认为0,即无限多个
    • q.qsize() # 查看当前队列中元素个数
    • q.maxsize # 队列最大个数
    • q.put(33, [ timeout=2] ) # 等待2秒,若2秒过后还没有空余位置则报错
    • q.put(33, [block=False]) # 默认是阻塞,且一直卡主等待,若为false则没有位置时直接报错
    • q.get() # 默认取数据,若队列中已经没有元素,则会阻塞卡主
    • q.get([block=False]) # 不阻塞,
    • q.get(timeout=2) # 超时时间
    • q.join() # 若队列中任务(获取和插入均为任务)还没有完成(不为空,且计数器归零),则主进程不结束,进行等待
    • q.task_done() # 该代码常在每个队列方法执行后书写,表示该方法已经执行完成,计数器归零
  • 后进先出队列(栈)(继承queue,即可用其父类中方法):
    • q = queue.LifoQueue() # last in first out
  • 优先级队列(继承queue):
    • q = queue.PriorityQueue()
    • q.put((11, ‘alex‘))  # 放元素的时候,附带指定一个优先级,队列中会按照优先级重新排序
  • 双向队列
    • q = queue.deque()

二、生产者、消费模型(队列)


import queue

import time

q = queue.Queue(20) # 创建个先进先出队列

# “生产者” 每个厨师都一直创建包子,直到队列满了阻塞,

def productor(arg):

while True:

q.put(str(arg)+‘:包子‘)   # 创建一个包子放入队列,厨师编号:包子

# “消费者” 每个顾客都一直消费包子,直到队列空了阻塞

def consumer(arg):

while True:

print(arg, q.get())  # 从队列拿出一个包子, 哪个厨师:包子

time.sleep(2)

for i in range(3): # 创建3个厨师

t = threading.Thread(target=productor, args=(i,))

t.start()

for j in range(20): # 创建20个人

t = threading.Thread(target=consumer, args=(,))

t.start()

  • 使用队列好处:
    • 结论:
      • 使用队列,可以增加client的并发处理,不至于client的请求都不能接受(拒绝服务)
      • 要真正提高处理能力,还得增加后端工作线程
    • 解释:
      • 场景:server并发假设为4个,客户端均为动态请求(insert into ..),每个insert语句执行事件若为20s
      • 不使用队列:

      • 流程:
        • server接到一个请求,立马拿来一个工作线程进行处理,处理过程中一直与client保持连接(连接处于挂起状态)
      • 并发能力:20s,最多4个并发
      • 请求处理:20s,4个工作线程可处理4个请求,1个工作线程只能处理一个(接进来的请求,没有人处理也是没卵用)
      • 使用队列

      • 流程:
        1. 当server接到用户请求后,直接丢进队列中,而后与client连接断开,
        2. 后端工作的线程(生产者)不断从队列中取出请求进行处理
        3. 当client再次查询上次请求执行结果,
          • 若请求还在队列中,则返回队列位置“请求正在处理,您前面还有N个人”
          • 若请求不在队列中,server只需要select下db即可返回(比insert快很多)
      • 并发能力:无限,因为丢进队列后就可以断开连接,即总是有4个连接可用
      • 请求处理:20s内,4个工作线程可处理4个请求,1个工作线程只能处理1个请求
时间: 2024-07-29 06:24:41

队列、生产消费模型.html的相关文章

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

python学习笔记-Day11 (线程、进程、queue队列、生产消费模型、携程)

线程使用 ###方式一 import threading def f1(arg): print(arg) t = threading.Thread(target=f1, args=(123,)) t.start() # start会调用run方法执行 # t是threading.Thread类的一个对象 # t.start()就会以线程的方式执行函数,可以使用pycharm ctrl选择start方法 # 找到Thread类的start方法,在start方法的注释中就已经写明,会去调用run()

生成器函数以及生产消费模型

1.生成器函数,即最终的输出用yield替代return,其他形式不变的函数,而且相比于return,输入yield函数不会立即停止 1 def test(): 2 print('你好') 3 return 10 4 def test_1(): 5 print('你好') 6 yield 10 7 a = test() 8 print(a) 9 b = test_1() 10 print(b) #<generator object test_1 at 0x00000000024F3570> 首

Python学习之路并发编程--信号量、事件、队列及生产消费模型

1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一个计数器,在同一时内,只能有指定数量的进程来执行某一段被控制的代码. import time,random from multiprocessing import Process,Semaphore def singing(i,sem): ''' :param i: 随机生成20个数的值 :para

Day9 进程同步锁 进程队列 进程池 生产消费模型

进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. 1 from multiprocessing import Process,Lock #引用函数 2 import time 3 def work(name,mutex): 4 mutex.acquire() #在这里加入锁 5 print('task <%s> is runing' %name) 6

JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型

/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 [email protected]*/ 前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球.首先第一步自然是先把界面弄好啦 1 public class BallUI extends JPanel { 2 3 private ArrayList<Ball> li = new ArrayList<Ball>(); 4 5 public static void main(String[] args

9 异常处理 操作系统 进程线程 队列+生产消费者模型 进程同步 回调函数

异常处理 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常的种类: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或包:基本上是路径问题或名称错误 IndentationError 语法错误(的子类) :代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访

并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁

一.守护进程 二.互斥锁 三.抢票 四.进程间通讯 五.进程间通讯2 一.守护进程 """ 进程间通讯的另一种方式 使用queue queue 队列 队列的特点: 先进的先出 后进后出 就像扶梯 """ from multiprocessing import Process,Queue # 基础操作 必须要掌握的 # 创建一个队列 # q = Queue() # # 存入数据 # q.put("hello") # q.put(