2011-09-01 44 views
6

我要開始4名resque工人,所以我用下面的命令多resque工人模式下創建額外的過程

bundle exec rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid >> log/resque_worker_QUEUE.log 

但要Web界面,它實際上開始8名工人。有兩個父進程和四個子進程。以下是處理過程的樹視圖:

 
ruby /code_base/bundle/ruby/1.9.1/bin/rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid 
\_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
    \_ [ruby] 
ruby /code_base/bundle/ruby/1.9.1/bin/rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid 
\_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
    \_ [ruby] 

無法弄清楚是什麼導致額外的進程啓動?

回答

13

您不希望在生產中使用COUNT = n選項,因爲它在線程中運行每個工作程序,而不是單獨的進程 - 這非常不穩定。

官方Resque文檔:

Running Multiple Workers 

At GitHub we use god to start and stop multiple workers. A sample god configuration file is included under examples/god. We recommend this method. 

If you'd like to run multiple workers in development mode, you can do so using the resque:workers rake task: 

$ COUNT=5 QUEUE=* rake resque:workers 
This will spawn five Resque workers, each in its own thread. Hitting ctrl-c should be sufficient to stop them all. 

Here's the example God monitoring/configuration file附帶Resque運行多個進程,並here's an example for monit

+0

我已經通過了該文檔和腳本文件,但我們正在使用monit。根據該腳本,似乎每個resque工人都在WORKER_TIMEOUT時間後死亡。現在,即使我進行了全新的部署,工作人員仍可能會使用舊的代碼。因此,在最壞的情況下,需要WORKER_TIMEOUT時間來加載新的代碼,這可能有時會成爲問題。對此有何想法? – bikashp

+0

只要您使用新部署的代碼啓動新工作人員,在殺死工作人員之前讓現有作業完成運行就沒有任何問題。 關鍵是向工作人員發送一個軟退出信號,以便在當前正在運行的作業完成時退出。所以是的,你可以讓一個工作人員運行舊代碼,但它的工作是在部署新代碼之前開始的。 – Winfield

+0

我用這種方法看到的另一個問題是當上帝失敗時。由於工人在WORKER_TIMEOUT之後死亡,因此不會有工人處理工作。 – bikashp