Rabbitmq中的优先级队列操作

1、%% 普通队列操作
in(X, 0, {queue, [_] = In, [], 1}) ->{queue, [X], In, 2};
in(X, 0, {queue, In, Out, Len}) when is_list(In), is_list(Out) -> {queue, [X|In], Out, Len + 1};

优先级队列操作:
in(X, Priority, Q = {queue, [], [], 0}) -> in(X, Priority, {pqueue, []});
in(X, Priority, Q = {queue,
, , }) -> in(X, Priority, {pqueue, [{0, Q}]});

主要的操作:

in(X, Priority, {pqueue, Queues}) ->
P = maybe_negate_priority(Priority),
{pqueue, case lists:keysearch(P, 1, Queues) of
             {value, {_, Q}} ->
                 lists:keyreplace(P, 1, Queues, {P, in(X, Q)});
             false when P == infinity ->
                 [{P, {queue, [X], [], 1}} | Queues];
             false ->
                 case Queues of
                     [{infinity, InfQueue} | Queues1] ->
                         [{infinity, InfQueue} |
                          lists:keysort(1, [{P, {queue, [X], [], 1}} | Queues1])];
                     _ ->
                         lists:keysort(1, [{P, {queue, [X], [], 1}} | Queues])
                 end
         end}.

根据优先级队列的优先级进行排序操作,如果队列的优先级为infinity则放在头部,其它队列优先级按照优先级数排序

2、%%出对列操作,其中 如果出队列后出队列为空,则从入队列中取出r2f(In,Len-1)到出队列当中
out({queue, [], [], 0} = Q) ->{empty, Q};
out({queue, [V], [], 1}) ->{{value, V}, {queue, [], [], 0}};
out({queue, [Y|In], [], Len}) ->

[V|Out] = lists:reverse(In, []),
{{value, V}, {queue, [Y], Out}, Len - 1};

out({queue, In, [V], Len}) when is_list(In) -> {{value,V}, r2f(In, Len - 1)};
out({queue, In,[V|Out], Len}) when is_list(In) -> {{value, V}, {queue, In, Out, L - en1}};

出队列的关键步骤:

out({pqueue, [{P, Q} | Queues]}) ->
{R, Q1} = out(Q),
NewQ = case is_empty(Q1) of
           true -> case Queues of
                       []           -> {queue, [], [], 0};
                       [{0, OnlyQ}] -> OnlyQ;
                       [_|_]        -> {pqueue, Queues}
                   end;
           false -> {pqueue, [{P, Q1} | Queues]}
       end,
{R, NewQ}.

有优先级的队列,则取出优先级后,Q队列如果为空,判断下个队列Queues,否则返回 {pqueue, [{P, Q1} | Queues]}

总结:入队和出队操作相对应,只是出队列操作返回的数格式不一样,类似 {{value, V}, {queue, In, Out, L - en1}}

时间: 2024-08-06 11:56:14

Rabbitmq中的优先级队列操作的相关文章

【转】java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

《转》JAVA中PriorityQueue优先级队列使用方法

该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就

java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

STL中的优先级队列priority_queue

priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另外priority_queue缺省比较规则是less: class Compare = less<typename Sequence::value_type> less对应的是按照大根堆来实现优先级队列,当然也可以将比较规则设置为greater,这时候是按照小根堆来实现的优先级队列. priori

php中使用redis队列操作实例代码

<?php /* 入队 */ $redis = new Redis(); $redis->connect('192.168.1.211',6379); while(True){ try{ $value = 'value_'.date('Y-m-d H:i:s'); $redis->LPUSH('key1',$value); sleep(rand()%3); echo $value."\n"; }catch(Exception $e){ echo $e->getM

初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现

这一次,笔者使用了STL库中的优先级队列(Priority Queue)来完成Dijkstra算法中extract-min()语句(即从未选中的节点中选取一个距离原点s最小的点)的功能.由于优先级队列的插入.删除操作只需要logn的时间花费,因此降低了不少运行时间. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(Ml

priority_queue 优先级队列

priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素).在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到.在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置.下面给出priority_queue的函数列表和VS2008中priority

优先级队列(Priority Queue)

优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列. 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. 1.2 优先级队列的特点 优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值

spring boot Rabbitmq集成,延时消息队列实现

本篇主要记录Spring boot 集成Rabbitmq,分为两部分, 第一部分为创建普通消息队列, 第二部分为延时消息队列实现: spring boot提供对mq消息队列支持amqp相关包,引入即可: [html] view plain copy <!-- rabbit mq --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-