標籤:python學習 執行 family 2-2 直接 [1] sys.argv argv false
協程和io多工區別
都繼承了相同的類 libevent.so
協程也可以理解是io多工
io多工更偏向io一點
協程是更上層的一種封裝 偏向於函數的切換。
RabbitMQ 訊息佇列
1.單發送單接收
2.單發送多接收
3.廣播、訂閱模式
4.有選擇的接收訊息 Routing (按路線發送接收)
5.更細緻的訊息過濾 Topics (按topic發送接收)
6.RPC
進程queue :
在父進程與子進程進行互動,或者同屬於同一以父進程下的多個子進程互動。
rabbitMq:兩個獨立的程式程式 或者 在java和python的程式通訊,不同機器的 通訊, 這時需要一個中間的代理。RabbitMQ。
為什麼生產者已經聲明了管道,消費者還要再次聲明?
如果生產者首先啟動,管道已經建立,不會有問題。
如果消費者首先啟動,沒有聲明管道,會報錯
在windows安裝了RabbitMQ
生產者
消費者
消費者的 callback函數
ch代表管道的記憶體對象
methon 隊列的資訊
body 資料
資料處理在此
rabbitMQ的消費者 消費資料是輪詢方式的
如果啟動3個消費者a b c
生產者第1次生產資料,a收到
生產者第2次生產資料,b收到
生產者第3次生產資料,c收到
生產者第4次生產資料,a收到
如此迴圈往複,公平的把訊息分給每個消費者,做到了負載平衡
注意,有參數no_ack
True代表 無論消費者是否把訊息處理完,都不給生產者回應,不關心訊息。
False代表 預設是False,訊息處理完給生產者回應
RabbitMQ根據消費者的回應而刪除訊息,如果訊息處理到一半,消費者掛掉,那麼
訊息,不會刪除,而是發給其他消費者。
windos 下使用以下命令 查到 當前的隊列和其中的訊息數
資料持久化
在建立管道時 設定durable=True 持久化隊列 在生產者和服務端都需要寫
在發送訊息時 設定如 持久化訊息 生產者
完整如:
rabbitMQ的負載平衡
在消費者端 設定
如此設定之後 如果當前的消費者處理的訊息超過1條,就會被轉寄到其他的消費者上。所有的消費者都設定,處理訊息快的消費者,處理完一條訊息會接著處理,處理慢的就會先把當前的訊息處理完,再接收下個訊息。這樣就做到了負責均衡。
設定廣播模式 訊息訂閱
訂閱發布 可以同時給綁定相同轉寄站的消費這發送訊息,但是訊息就像廣播一樣,雖然你不在聽了。但是訊息還是正常發送,錯過了的訊息不會再出現。
生產者
exchange=“log”是轉寄站
type=‘fanout’
不用再聲明queue 需要在消費者聲明queue
消費者:
sys.argv[] 擷取外部的參數
比如儲存一個test.py
import sys
a=sys.argv[1]
print(a)
運行 時加一個參數 what 結果如下 得到what
具體解釋:E:\python學習\學習網頁\Python中 sys.argv[]的用法簡明解釋
sys.exit()的退出比較優雅,調用後會引發SystemExit異常,可以捕獲此異常,執行異常處理中的代碼
os._exit()直接將python解譯器退出,餘下的語句不會執行
exit(0):無錯誤退出
exit(1):有錯誤退出
有選擇的接受訊息
生產者在發送訊息需要
test_p.py error helle_word
test_p.py(生產者的檔案) error(加上類型) helle_word(內容)
消費者在發送訊息需要
test_c.py error info
test_c.py(消費者的檔案) error info(加上類型,可以多寫幾個)
當然 把error換成 sb都可以,只是生產者和消費者的類型如果對不上就收不到訊息
python學習筆記——拾壹