2013-06-18 48 views
8

我想使用Celery在具有四個Tesla卡的GPU服務器上運行作業。我僱用了四名工人的芹菜工人,這樣每張卡片總是運行一份工作。在Celery中獲取工作者ID

我的問題是如何指導工作人員每個要求一個GPU。目前,我靠,假設工作進程都應該有連續的進程ID:

device_id = os.getpid() % self.ndevices 

不過,我這個是不能保證總是工作,即當工作進程重新得到隨着時間的推移。所以理想情況下,我想直接獲得每個工作人員的ID。有人可以告訴我是否可以從任務內檢查工作人員,還是可以建議採用不同的解決方案在GPU之間分配工作?

回答

11

如果使用CELERYD_POOL = 'processes',工人游泳池被billiard處理,這確實發生暴露其基於0的工藝指標:

from billiard import current_process 
from celery import task 

@task 
def print_info(): 
    # This will print an int in [0..concurrency[ 
    print current_process().index 

index是從零開始的,如果一個工人恰巧重新啓動它將保持其索引。

我找不到雖然關於index值的任何文件:/

+1

我想我還不清楚我的術語:我其實有一個工人,其派生四個過程。我期望得到的是Celery(0-3)中的進程ID,而不是UNIX pid。我想有多個芹菜工人只需一個工序就可以工作,但不太方便。獲取ID的位置並不重要:它可以在任務級別檢查,也可以是每個進程的全局變量。 – oceanhug

+1

同意,我對我的解決方案也不是很滿意......如果您有一些由supervisord管理的工人的生產部署,但它需要專門的配置,並且不會基於單個「 --concurrency = xxx'參數。有*是一個'current_app.pool',但我不知道該怎麼辦... –

+1

編輯:發現一個全新的答案\ o/ –