2012-10-10 29 views
11

Tôi có thể sử dụng Celery Group nguyên thủy làm nhiệm vụ ô trong luồng công việc bản đồ/giảm không?Nhiệm vụ của Nhóm Celery để sử dụng trong quy trình làm việc trên bản đồ/giảm bớt

Hoặc cụ thể hơn: Các thao tác phụ trong Nhóm có thể chạy trên nhiều công nhân trên nhiều máy chủ không?

Từ các tài liệu:

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 

Đó dường như ngụ ý các nhiệm vụ đều gửi cho một người lao động ...

Trước 3.0 (và vẫn còn) người ta có thể bắn ra các nhiệm vụ nhỏ trong một TaskSet mà sẽ chạy trên nhiều máy chủ. Vấn đề là xác định xem tất cả các nhiệm vụ đã hoàn thành thực hiện. Điều đó thường được thực hiện bằng cách bỏ phiếu tất cả các nhiệm vụ không thực sự thanh lịch. Tôi tự hỏi liệu nhóm nguyên thủy có thể được sử dụng để giảm thiểu vấn đề này hay không.

+0

phân phối tác vụ hoàn toàn phù hợp với lệnh 'nhóm' thông thường ít nhất trong cần tây 3.1, có vẻ như tuyên bố ở trên đã bị xóa khỏi tài liệu – Grozz

Trả lời

23

Tôi phát hiện ra rằng nó có thể sử dụng Chords cho một bản đồ như vậy giảm như vấn đề.

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

Khi mapper được thực thi trên một cụm ba công nhân/máy chủ đầu tiên nó thực hiện các mapper mà tách vấn đề của bạn và tạo ra subtasks mới được một lần nữa nộp cho người môi giới. Chúng chạy song song vì hàng đợi được tất cả các nhà môi giới tiêu thụ. Ngoài ra một nhiệm vụ hợp âm được tạo ra để thăm dò tất cả các bản đồ để xem họ đã hoàn thành chưa. Khi hoàn thành nhiệm vụ giảm được thực hiện, nơi bạn có thể dán kết quả của bạn lại với nhau.

Trong tất cả: có, điều đó là có thể. Cảm ơn các bạn rau!

Các vấn đề liên quan