首頁 後端開發 Python教學 Python rabbitmq的使用(二)

Python rabbitmq的使用(二)

Jan 17, 2017 pm 02:51 PM

上一篇介紹了rabbitmq的安裝和經典的hello world!實例。這裡將對工作隊列(Work Queues)做一個了解。因為是接上一篇說明的,所以如果沒看過上一篇,看這篇可能會比較難懂。上一篇的地址是:ubuntu安裝rabbitmq和python的使用實作


訊息也可以理解為任務,訊息發送者可以理解為任務分配者,訊息接收者可以理解為工作者,當工作者接收到一個任務,還沒完成的時候,任務分配者又發一個任務過來,那就忙不過來了,於是就需要多個工作者來共同處理這些任務,這些工作者,就稱為工作隊列。結構圖如下:

Python rabbitmq的使用(二)

rabbitmq的python實例工作佇列


準備工作(Preparation)


準備工作(Preparation)


工作者。

修改send.py,從命令列參數接收訊息,並發送

import sys
message= ' '.join(sys.argv[1:])or "Hello World!"
channel.basic_publish(exchange='',
routing_key='hello',
body=message)
print " [x] Sent %r" % (message,)
登入後複製

修改receive.py的回呼函數。

import time
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
time.sleep( body.count('.') )
print " [x] Done"
登入後複製

這邊先打開兩個終端,都運行worker.py,處於監聽狀態,這邊就相當於兩個工作者。打開第三個終端,執行new_task.py

$ python new_task.py First message.
$ python new_task.py Second message..
$ python new_task.py Third message...
$ python new_task.py Fourth message....
$ python new_task.py Fifth message.....
登入後複製

觀察worker.py接收到任務,其中一個工作者接收到3個任務:

$ python worker.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'First message.'
[x] Received 'Third message...'
[x] Received 'Fifth message.....'
登入後複製

另外一個工作者接收到2個任務:

$ python worker.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Second message..'
[x] Received 'Fourth message....'
登入後複製

從上面來看,每個工作者,都會依序分配到任務。那如果一個工作者,在處理任務的時候掛掉,這個任務就沒有完成,應當交由其他工作者處理。所以應當有一種機制,當一個工作者完成任務時,就會回饋訊息。

訊息確​​認(Message acknowledgment)



訊息確​​認就是當工作者完成任務後,會回饋給rabbitmq。修改worker.py中的回呼函數:

def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
time.sleep(5)
print " [x] Done"
ch.basic_ack(delivery_tag= method.delivery_tag)
登入後複製

這邊停頓5秒,可以方便ctrl+c退出。

去除no_ack=True參數或設定為False也可以。

channel.basic_consume(callback, queue='hello', no_ack=False)
登入後複製

用這個程式碼運行,即使其中一個工作者ctrl+c退出後,正在執行的任務也不會遺失,rabbitmq會將任務重新分配給其他工作者。


訊息持久化儲存(Message durability)

雖然有了訊息回饋機制,但是如果rabbitmq自身掛掉的話,那麼任務還是會遺失。所以需要將任務持久化儲存起來。聲明持久化儲存:
channel.queue_declare(queue='hello', durable=True)
登入後複製
但是這個程式會執行錯誤,因為hello這個佇列已經存在,並且是非持久化的,rabbitmq不允許使用不同的參數來重新定義存在的佇列。重新定義一個佇列:

channel.queue_declare(queue='task_queue', durable=True)
登入後複製


在發送任務的時候,用delivery_mode=2來標記任務為持久化儲存:

channel.basic_publish(exchange='',
routing_key="task_queue",
body=message,
properties=pika.BasicProperties(
delivery_mode= 2,# make message persistent
))
登入後複製

中,雖然每個工作者是依序分配到任務,但是每個任務不一定一樣。可能有的任務比較重,執行時間比較久;有的任務比較輕,執行時間比較短。如果能公平調度就最好了,使用basic_qos設定prefetch_count=1,使得rabbitmq不會在同一時間給工作者分配多個任務,即只有工作者完成任務之後,才會再次接收到任務。

channel.basic_qos(prefetch_count=1)
登入後複製

new_task.py完整程式碼

#!/usr/bin/env python
import pika
import sys
connection= pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel= connection.channel()
channel.queue_declare(queue='task_queue', durable=True)
message= ' '.join(sys.argv[1:])or "Hello World!"
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()
登入後複製

worker.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'
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
time.sleep( body.count('.') )
print " [x] Done"
ch.basic_ack(delivery_tag= method.delivery_tag)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
queue='task_queue')
channel.start_consuming()
登入後複製

以上就是Python rabbitmq的使用(二)的內容,更多相關內容請關注PHPcn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PS一直顯示正在載入是什麼原因? PS一直顯示正在載入是什麼原因? Apr 06, 2025 pm 06:39 PM

PS“正在載入”問題是由資源訪問或處理問題引起的:硬盤讀取速度慢或有壞道:使用CrystalDiskInfo檢查硬盤健康狀況並更換有問題的硬盤。內存不足:升級內存以滿足PS對高分辨率圖片和復雜圖層處理的需求。顯卡驅動程序過時或損壞:更新驅動程序以優化PS和顯卡之間的通信。文件路徑過長或文件名有特殊字符:使用簡短的路徑和避免使用特殊字符。 PS自身問題:重新安裝或修復PS安裝程序。

PS啟動時一直顯示正在載入如何解決? PS啟動時一直顯示正在載入如何解決? Apr 06, 2025 pm 06:36 PM

PS啟動時卡在“正在載入”可能是由於各種原因造成的:禁用損壞或衝突的插件。刪除或重命名損壞的配置文件。關閉不必要的程序或升級內存,避免內存不足。升級到固態硬盤,加快硬盤讀取速度。重裝PS修復損壞的系統文件或安裝包問題。查看錯誤日誌分析啟動過程中的錯誤信息。

PS打開文件時一直顯示正在載入如何解決? PS打開文件時一直顯示正在載入如何解決? Apr 06, 2025 pm 06:33 PM

PS打開文件時出現“正在載入”卡頓,原因可能包括:文件過大或損壞、內存不足、硬盤速度慢、顯卡驅動問題、PS版本或插件衝突。解決方法依次為:檢查文件大小和完整性、增加內存、升級硬盤、更新顯卡驅動、卸載或禁用可疑插件、重裝PS。通過逐步排查,並善用PS的性能設置,養成良好的文件管理習慣,可以有效解決該問題。

mysql安裝後怎麼使用 mysql安裝後怎麼使用 Apr 08, 2025 am 11:48 AM

文章介紹了MySQL數據庫的上手操作。首先,需安裝MySQL客戶端,如MySQLWorkbench或命令行客戶端。 1.使用mysql-uroot-p命令連接服務器,並使用root賬戶密碼登錄;2.使用CREATEDATABASE創建數據庫,USE選擇數據庫;3.使用CREATETABLE創建表,定義字段及數據類型;4.使用INSERTINTO插入數據,SELECT查詢數據,UPDATE更新數據,DELETE刪除數據。熟練掌握這些步驟,並學習處理常見問題和優化數據庫性能,才能高效使用MySQL。

PS羽化如何控製過渡的柔和度? PS羽化如何控製過渡的柔和度? Apr 06, 2025 pm 07:33 PM

羽化控制的關鍵在於理解其漸變本質。 PS本身不提供直接控制漸變曲線的選項,但你可以通過多次羽化、配合蒙版、精細選區,靈活調整半徑和漸變柔和度,實現自然過渡效果。

mysql安裝後怎麼優化數據庫性能 mysql安裝後怎麼優化數據庫性能 Apr 08, 2025 am 11:36 AM

MySQL性能優化需從安裝配置、索引及查詢優化、監控與調優三個方面入手。 1.安裝後需根據服務器配置調整my.cnf文件,例如innodb_buffer_pool_size參數,並關閉query_cache_size;2.創建合適的索引,避免索引過多,並優化查詢語句,例如使用EXPLAIN命令分析執行計劃;3.利用MySQL自帶監控工具(SHOWPROCESSLIST,SHOWSTATUS)監控數據庫運行狀況,定期備份和整理數據庫。通過這些步驟,持續優化,才能提升MySQL數據庫性能。

PS卡在載入界面怎麼辦? PS卡在載入界面怎麼辦? Apr 06, 2025 pm 06:54 PM

PS卡在載入界面可能是由軟件自身(文件損壞或插件衝突)、系統環境(驅動過時或系統文件損壞)或硬件(硬盤損壞或內存條故障)問題造成的。首先檢查計算機資源是否充足,關閉後台程序釋放內存和CPU資源。修復PS安裝或檢查插件是否存在兼容性問題。更新或回退PS版本。檢查顯卡驅動並更新,運行系統文件檢查。若排除上述問題,則可以嘗試硬盤檢測和內存測試。

mysql 是否要付費 mysql 是否要付費 Apr 08, 2025 pm 05:36 PM

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

See all articles