2016-12-27 66 views

回答

1

的祕訣,從生產者停止消費者通常是有帶毒郵件。

有些人通過多個隊列完成此操作,有些人通過專門的消息下游停止消費(後者僅適用於單個工作人員)。

基本上,當您的python腳本看到毒訊時,它立即關閉。您可能希望在單獨的隊列中使用此功能的原因是,如果您有多個工作人員,則可能需要廣播該消息,因此您需要爲每個工作人員設置一個專用隊列。

至於啓動腳本,最好只是讓工作人員運行並讓他們等待重新啓動信息。

否則,您可以創建一個觀察者工作站或控制器來接收消息並控制進程,如重新啓動python腳本,但這非常複雜。

我相信芹菜做了很多這個,如果你正在尋找一些precanned。

編輯 - 毒性信息可能已經意味着AMQP中的其他內容。我的意思是你自己的毒訊。

由於您想在運行時殺死某些東西,您必須以廣播的方式進行操作。

對於每個消費者,實際上每個python腳本都有兩個消費者。

一個接受實際數據,另一個接收命令來啓動和停止數據使用者。

如果你想創業,你可以有一個廣播消息(JSON,但你可以使用任何你喜歡的格式,或者你也可以使用AMQP頭性能以及)):

{ 
     "command" : "start" 
    } 

當你想停止你的製片人可能會發出這樣的消息:

{ 
     "command": "stop" 
    } 

你的消費者的回調是要看看是否message.command == 'stop'

一旦你看到你對實際接收數據以及實際殺害無論是當前正在運行的消費者致電channel.basicCancel(consumerTag)該消息。當前正在運行的任何殺戮程序都高度依賴於您的設置,所以我無法真正理解這一點,因爲它可能是一個單獨的進程,或者如果使用某個事件引擎,它可能是單獨的線程或事件。殺死長時間運行的進程本質上是非常棘手的。

如果使用主題交換,或者您可以使用扇出(aka broadcast)交換,則每個python腳本都應該爲命令使用者提供排他隊列。

數據使用者將與所有其他腳本共享一個隊列。

+0

從我擡頭看的所有東西,看起來毒害消息是消費者無法處理消息的時候。那麼如何幫助消費者停止?消費者甚至不會收到該消息,因爲它已經在處理當前的腳本了,不是嗎? – joe

+0

對不起,我說毒藥信息,因爲AMQP使用的可能是官方毒藥信息。該術語超載。我的意思是毒害消息是一種自定義的消息,您在您的結尾創建,表示結束。 –

0

您可以考慮使用像芹菜這樣的軟件包來管理RabbitMQ作爲您的經紀商。芹菜有一個revoke()函數可以用來終止任務。

>> from celery.task.control import revoke 
>> revoke(task_id, terminate=True) 

因爲它聽起來像你想的過程中就已經停止任務 - 設置爲True的終止選項的撤銷請求將終止已執行的任務。這在默認情況下是錯誤的。

參考: http://docs.celeryproject.org/en/latest/userguide/workers.html#commands