演算法複習 - 歸併排序求解逆序數問題(分治)
阿新 • • 發佈:2020-12-21
RabbitMQ 訊息佇列介紹
RabbitMQ也是訊息佇列,那RabbitMQ和之前python的Queue有什麼區別麼?
py 訊息佇列:
執行緒 queue(同一程序下執行緒之間進行互動)
程序 Queue(父子程序進行互動 或者 同屬於同一程序下的多個子程序進行互動)
如果是兩個完全獨立的python程式,也是不能用上面兩個queue進行互動的,或者和其他語言互動有哪些實現方式呢。
【Disk、Socket、其他中介軟體】這裡中介軟體不僅可以支援兩個程式之間互動,可以支援多個程式,可以維護好多個程式的佇列。
像這種公共的中介軟體有好多成熟的產品:
RabbitMQ
ZeroMQ
ActiveMQ
……
RabbitMQ:erlang語言 開發的。
Python中連線RabbitMQ的模組:pika 、Celery(分散式任務佇列) 、haigha
可以維護很多的佇列
RabbitMQ 教程官網:http://www.rabbitmq.com/getstarted.html
幾個概念說明:
Broker:簡單來說就是訊息佇列伺服器實體。 Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。 Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。 Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。 Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。 vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。 producer:訊息生產者,就是投遞訊息的程式。 consumer:訊息消費者,就是接受訊息的程式。 channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務
RabbitMQ基本示例
生產者
send.py
'''生產者的意思,也可以稱為傳送者,例項中表現為send.py''' import pika import random # 新建連線,rabbitmq安裝在本地則hostname為'localhost' hostname='localhost' parameters = pika.ConnectionParameters(hostname) # 引數 connection = pika.BlockingConnection(parameters) # 連線 # 建立通道 channel = connection.channel()# 宣告一個佇列,生產者和消費者都要宣告一個相同的佇列,用來防止萬一某一方掛了,另一方能正常執行 channel.queue_declare(queue='aaa') number = random.randint(1,1000) body = f'hello world {number}' # 交換機;佇列名,寫宣告將訊息發往那個佇列;訊息內容 # routing_key在使用匿名交換機的時候才需要制定,表示傳送到那個佇列 channel.basic_publish(exchange='', routing_key='aaa', body=body) print(f'sent,{body}') connection.close()
消費者
receive.py
'''消費者的意思,也可以稱為接收者,例項中表現為receive.py''' import pika # pika非同步 # 新建連線,rabbitmq安裝在本地則hostname為'localhost' hostname = 'localhost' parameters = pika.ConnectionParameters(hostname) # 引數: 傳遞使用者名稱和密碼的物件(https://blog.csdn.net/comprel/article/details/94662916) connection = pika.BlockingConnection(parameters) # 連線 # 建立通道 channel = connection.channel() channel.queue_declare(queue='aaa') def callback(ch, method, properties, body): print(4,body) # 告訴rabbitmq使用callback來接收資訊 channel.basic_consume('aaa',callback,False) # 開始接收資訊,並進入阻塞狀態,佇列裡有資訊才會呼叫callback進行處理,按ctrl+c退出 print (' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()