1. 程式人生 > >RabbitMQ訊息通訊,一個生產者和多個消費者

RabbitMQ訊息通訊,一個生產者和多個消費者

上一則文章講解了RabbitMQ的安裝和簡單一對一訊息通訊實現方法,具體可參考上一篇文章:http://blog.csdn.net/u012631731/article/details/72887588

這則文章講述一個生產者和多個消費者的訊息通訊。


直接上原始碼,在原始碼裡面進行註釋講述吧

client.py

#!/usr/bin/env python
import pika
import sys
#建立一個連線,目標地址為本機(localhost)
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
#建立一個訊息通道
channel = connection.channel()
#建立一個訊息佇列,訊息佇列的名稱為task_queue,
#這裡的第二個引數durable,是對訊息佇列的設定,
#使得RabbitMQ在發生異常退出時傳送的訊息不會被丟失,該訊息會被髮送給其他消費者
channel.queue_declare(queue='task_queue', durable=True)
message = ' '.join(sys.argv[1:]) or "Hello World!"
#設定轉換方式(預設),關聯訊息佇列(routing_key),繫結訊息體(body)
#delivery_mode 是設定訊息佇列的訊息持久化,=1是不持久化,=2是持久化
channel.basic_publish(exchange='',
                      routing_key='task_queue',
                      body=message,
                      properties=pika.BasicProperties(
                         delivery_mode = 2, # make message persistent
                      ))
print(" [x] Sent %r" % message)
#傳送完畢後關閉連線
connection.close()

server.py

#!/usr/bin/env python
import pika
import time
#不解釋
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
#不解釋
channel = connection.channel()
#不解釋
channel.queue_declare(queue='task_queue', durable=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
#在取訊息的這個回撥函式裡面加了一個sleep,這樣可以模擬不同消費者之間切換任務
#並且配置了訊息接受後的訊息確認,在一對一通訊時我們設定no_ack為true
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    time.sleep(body.count(b'.'))
    print(" [x] Done")
    ch.basic_ack(delivery_tag = method.delivery_tag)
#設定每一個消費者最大的訊息處理數量,這裡設定為兩個
channel.basic_qos(prefetch_count=2)
channel.basic_consume(callback,
                      queue='task_queue')
channel.start_consuming()
最後使用python執行它們,執行多個python server.py 和一個python client.py
更多請查詢RabbitMQ官網:http://www.rabbitmq.com/

相關推薦

RabbitMQ訊息通訊一個生產者消費者廣播式訊息通訊

上一則我們說到了一個對多個的RabbitMQ訊息佇列通訊的實現方法,生產者傳送的訊息只能被一個消費者接收並處理,上則請閱讀:http://blog.csdn.net/u012631731/article/details/78450389 本則說的是廣播式的訊息通訊方法實現,

RabbitMQ訊息通訊一個生產者消費者

上一則文章講解了RabbitMQ的安裝和簡單一對一訊息通訊實現方法,具體可參考上一篇文章:http://blog.csdn.net/u012631731/article/details/72887588 這則文章講述一個生產者和多個消費者的訊息通訊。 直接上原始碼,在原始

易學筆記-RabbitMQ教程2:一個生產者消費者

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

RabbitMQ訊息通訊生產者傳送訊息給指定的消費者訊息佇列

上一篇文章描述了,通過使用廣播式的通訊方式,讓生產者把訊息廣播給每一個消費者,本節我們介紹另外一個方式,生產者可以指定消費者,把訊息傳送給它: client.py #!/usr/bin/env python import pika import sys connectio

易學筆記-RabbitMQ教程1:一個生產者一個消費者

易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/

tensorflow的session.run執行一個opop的區別

背景: session.run方法可以傳入一個op,也可以傳入op列表,例如,我們希望執行op1和op2,有兩種寫法: sess.run(op1) sess.run(op2) 和 sess.run([op1, op2]) 如果op1和op2有相互包含關係,第寫法1會將op1和

java Split如何去除一個空格空格

用Split函式可以去除輸入一個字串中的空格,並且一般都是將它儲存在一個字串陣列之中 例如: import java.util.Scanner; public class Main { public static void main(St

SQLAlchemy下一個表outer join

例如有三個表表A: -----------------------------aid, PKbidcida.name表B-----------------------------bid, PKb.name表C-----------------------------cid,

負載均衡實現一個域名對應IP地址

使用負載均衡實現,傳統和常規做法,其他方式需要特殊處理。(dns輪詢,或者自己做解析) 1、一個域名設定多個dns服務或者伺服器進行解析,同一個域名的每個解析都指向不同的ip地址,這樣應答快的dns優先進行解析,這樣就能保證最快定向到指定的網站空間去。如果空間也存在不同地

java Split如何去除一個空格空格

用Split函式可以去除輸入一個字串中的空格,並且一半都是將它儲存在一個字串陣列之中 例如: import java.util.Scanner;     public class Main {         public static void main(String[] args) {   

JAVA學習51_ Java Split如何去除一個空格空格

用Split函式可以去除輸入一個字串中的空格,並且一般都是將它儲存在一個字串陣列之中 例如: import java.util.Scanner;     public class Main {         public static void main(St

RabbitMq六種使用模式(2)_消費者

上一篇文章中,一個佇列只有一個消費者,其實可以同時有多個消費者從同一佇列裡面取訊息,如何分配有rabbitmq伺服器決定; 程式碼基本上如上文一致,只是有多個consumer在監控著佇列,每個consumer獨立處理獲取的訊息; 1:訊息的確認機制 目前的程式碼,一旦co

一個執行緒handler會有多少looperlooper如何區分handler會不會導致訊息錯亂。

面試題: 問題1:一個執行緒中初始化多個handler,會產生多少個looper? 問題2:如果只有一個looper,looper如何區分handler,handler傳送了訊息會不會導致Looper錯亂,最終不知道誰處理。 1 一個執行緒中初始化多個handler,會

Socket通訊 一個伺服器對客戶端不能延遲接受資訊的實現

實驗要求: 1.一個時間點,無論哪個基站有資料傳送,伺服器必須同時接收。不能延遲等待這個客戶端接收完畢再接收另一個客戶端; 2.客戶端不能關閉,一直連線,以防資料遺漏 知識點: 多執行緒 同時開啟多個任務,不用按照程式的執行順序來; 基本的程式碼如下: pack

一個生產者生產產品消費者同時獲得產品

void * produce(void *ptr) {     for (int i = 0; i < 20; ++i)     {         pthread_rwlock_wrlock(&sharedData.rwlock);         sharedData.product = i

spring+activemq配置生產者消費者併發處理訊息

先貼配置 <?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://w

C++ Socket網路通訊實現一個伺服器端客戶端的通訊

一 描述1 採用C++語言 2 編譯環境是code::blocks 3 使用的是非阻塞套接字 二 功能描述1 一個伺服器對多個客戶端 2 伺服器端主要負責處理資料的輸入併發送,具體是通過傳送指令向其指定的客戶端傳送資料,傳送接收指令讀取其指定的客戶端傳送的資料 3 客戶端的

ASP.NET Core SignalR :學習訊息通訊實現一個訊息通知

 什麼是 SignalR        目前我用業餘時間正在做一個部落格系統,其中有個功能就是評論通知,就是假如A使用者評論B使用者的時候,如果B使用者首頁處於開啟狀態,那麼就會提示B使用者有未讀訊息。暫時用SignalR來實現這個功能。我也是看了兩天的資料才

連表查詢(3)之根據相關條件查詢另外一個表或表的某字段

兩個 mode object 添加 就會 resultmap control var 多個 1、送檢單位 代理商是從代理商表中取得數據 銷售人員從銷售表中取得數據 說一個簡單的思路: sql語句找到連接兩個表的條件,把另外一個表要用到的字段 寫一個 <re

類模板的聲明定義都寫到頭文件中可以分到.h文件中

測試 blog alt com src 類的聲明 技術 寫到 nbsp 通常類模板的聲明和定義都寫到頭文件中,那麽為了看著清晰,類的聲明和定義可以分開寫到多個頭文件中嗎,測試: 類模板的聲明和定義都寫到頭文件中,可以分到多個.h文件中