Подтвердить что ты не робот

Задача группы сельдерей для использования в карте/сокращении рабочего процесса

Могу ли я использовать примитив Group в качестве зонтичной задачи на карте/сокращении рабочего процесса?

Или более конкретный: могут ли подзадачи в группе выполняться несколькими сотрудниками на нескольких серверах?

Из документов:

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

Это похоже на то, что все задачи отправляются одному работнику...

До 3.0 (и все еще) можно было отменить подзадачи в TaskSet, которые будут выполняться на нескольких серверах. Проблема заключается в том, что все задачи завершены. Обычно это делается путем опроса всех подзадач, которые не очень элегантны. Мне интересно, может ли примитив группы использоваться для смягчения этой проблемы.

4b9b3361

Ответ 1

Я выяснил, что для такой карты можно использовать аккорды для подобной задачи.

@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)

Когда оператор сопоставления выполняется в кластере из трех рабочих/серверов, он сначала выполняет преобразование, которое разбивает вашу проблему и создает новые подзадачи, которые снова передаются брокеру. Они выполняются параллельно, потому что очередь потребляется всеми брокерами. Также создается задача с аккордом, которая проверяет все карты, чтобы узнать, закончились ли они. Когда это делается, задача сокращения выполняется, когда вы можете склеить свои результаты вместе.

В целом: да, возможно. Спасибо за овощных парней!