2012-10-10 14 views
11

Czy mogę użyć prymitywu Celery Group jako zadania parasola w mapie/zmniejszyć przepływ pracy?Zadanie dla grupy docelowej do użycia w mapie/zredukowanie przepływu pracy

Lub dokładniej: czy podzadania w grupie mogą być uruchamiane na wielu pracownikach na wielu serwerach ?

Od docs:

However, if you call apply_async on the group it will send a special 
grouping task, so that the action of calling the tasks happens in a worker 
instead of the current process 

To zdaje się sugerować, zadania są przesłać do jednego pracownika ...

Przed 3.0 (i nadal) można wystrzelić z podzadań w którym w taskset działałby na wielu serwerach. Problem polega na określeniu, czy wszystkie zadania zostały zakończone. Zwykle odbywa się to poprzez sondowanie wszystkich podzadań, które nie są naprawdę eleganckie. Zastanawiam się, czy prymityw grupy można użyć do złagodzenia tego problemu.

+0

rozprowadza zadania idealnie dobrze za pomocą zwykłego polecenia 'group' przynajmniej w selerze 3.1, wydaje się, że powyższe stwierdzenie zostało usunięte z dokumentacji – Grozz

Odpowiedz

23

Dowiedziałem się, że możliwe jest użycie akordów dla takiej mapy, jak zmniejszyć problem.

@celery.task(name='ic.mapper') 
def mapper(): 
    #split your problem in embarrassingly parallel maps 
    maps = [map.s(), map.s(), map.s(), map.s(), map.s(), map.s(), map.s(), map.s()] 
    #and put them in a chord that executes them in parallel and after they finish calls 'reduce' 
    mapreduce = celery.chord(maps)(reduce.s())  
    return "{0} mapper ran on {1}".format(celery.current_task.request.id, celery.current_task.request.hostname) 

@celery.task(name='ic.map') 
def map(): 
    #do something useful here 
    import time 
    time.sleep(10.0) 
    return "{0} map ran on {1}".format(celery.current_task.request.id, celery.current_task.request.hostname) 

@celery.task(name='ic.reduce') 
def reduce(results): 
    #put the maps together and do something with the results 
    return "{0} reduce ran on {1}".format(celery.current_task.request.id, celery.current_task.request.hostname) 

Gdy odwzorowujący jest wykonywany na klastrze trzech pracowników/serwerów najpierw wykonuje mapowania, która dzieli swój problem i tworzy nowe podzadań, które są ponownie przedstawione do brokera. Działają one równolegle, ponieważ kolejka jest zużywana przez wszystkich brokerów. Tworzone jest również zadanie akordów, które sonduje wszystkie mapy, aby zobaczyć, czy zostały zakończone. Po wykonaniu zadania redukuj, gdzie możesz skleić wyniki razem.

Podsumowując: tak, jest to możliwe. Dzięki za chłopaki z warzyw!

Powiązane problemy