大家都知道RabbitMQ是用來處理高併發,多個請求,通過生產者和消費者以及channel的技術來實現消息的高併發處理的技術。
那麼如何在代碼裏面裏面實現呢?
生產者/消費者模式
1.首先我們要知道,RabbitMQ的實現模式,通過創建一個隊列來存儲生產者發送的消息,然後消費者通過既定的規則去隊列裏面去取,然後做相應的動作。
一、設計生產者:
在開始編寫代碼之前,我們要確認電腦上是否安裝了pika庫,怎麼知道呢?
打開“File”——>"Other setttings"——>"Preferences for New Projects",
在彈出的界面,選擇“Project Interpreter”,看右側的界面是否有pika庫。
if pika not in xl_list: #如果pika不在下拉列表裏面點擊下面的“➕”符號
在彈出的搜索框中輸入pika,就會出現pika,點擊鼠標選擇,然後點擊下面的“Install Package”,如果安裝失敗的話會有提示,我的因爲版本的問題,在這裏兩次安裝失敗,我就知道在這裏安裝肯定是無法實現的了。於是我打開shell客戶端,然後在裏面輸入
提示安裝成功。然後就可以在Pycharm上看到我們pika庫。
點擊OK,就可以了。
二、開始寫代碼了
send.py
# !usr/bin/env python3.7
#encoding=utf-8
#author = gaos
"""
發送者
"""
import pika
credentials = pika.PlainCredentials('admin','admin')
#鏈接RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('127.0.0.1','5672','/',credentials))
#創建通道
channel = connection.channel()
#聲明隊列hello,RabbitMQ的消息隊列機制 如果隊列不存在那麼數據將會被丟失掉,下面我們先聲明一個隊列,如果不存在創建
channel.queue_declare(queue='hello')
#給隊列中添加消息
channel.basic_publish(exchange="",
routing_key="hello",
body="Hello World"
)
print("向隊列hello添加數據結束")
注意:最開始的時候我按之前的教程裏面在調用的是publish函數,但是有提示報錯,沒有publish函數,所以這個查了網上的資料才發現原來是,後面的辦法是publish改成了basic_publish導致的,改過來之後就可以了。
receive.py
# !/usr/bin/env python3.7
# -*- coding:utf-8 -*-
# __author__ == 'Gaos'
"""
消費者/接收方
"""
import pika
# 認證信息
credentials = pika.PlainCredentials("admin", "admin")
# 連接RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters("127.0.0.1", 5672, "/", credentials))
# 創建通道
channel = connection.channel()
# 聲明隊列hello,RabbitMQ的消息隊列機制如果隊列不存在那麼數據將會被丟掉,下面我們聲明一個隊列如果不存在創建
channel.queue_declare(queue='hello')
"""
在發送方已經hello隊列了,爲什麼在接收方也是消費者這裏還在聲明一邊隊列?
發送方/接收方 ,接收的先起來了
如果說你能100%啓動消費者之前一定聲明瞭隊列,這裏不謝也可以
"""
# 訂閱的回調函數這個訂閱回調函數是由pika庫來調用的
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
# 定義通道消費者參數
channel.basic_consume(queue='hello',
on_message_callback=callback,
auto_ack=True) # 這個地方按照視頻裏面寫有錯誤,原因在於新版的pika裏面,參數的位置發生了改變
print(' [*] Waiting for messages. To exit press CTRL+C')
# 開始接收信息,並進入阻塞狀態,隊列裏有信息纔會調用callback進行處理。按ctrl+c退出。
channel.start_consuming()
完成之後,在Pycharm裏面啓動Receive.py 和send.py 就可以看到結果了。
先啓動recive.py
然後啓動send.py
每當我們運行一次send.py ,receive.py就會收到一條數據。
連續運行三次send.py之後,send.py 收到並輸出的數據。
參考網址:
https://www.jianshu.com/p/72e8f9ecb888 basic_consume() got multiple values for keyword argument 'queue'
https://www.jianshu.com/p/5d3960e3eb06 《玩轉RabbitMQ之四:第一個小程序Hello World》
https://www.cnblogs.com/luotianshuai/p/7469365.html 《RabbitMQ介紹》