2012-12-18 29 views
5

Tôi muốn sử dụng một nhóm (hoặc khối) bên trong một chuỗi, như:Cần tây - nhóm bên trong một chuỗi

chain(getRange.s(3), GROUP() , xsum.s()) 

đâu GROUP() là một nhóm các double() nhiệm vụ, ví dụ: group(double(0),double(1),double(2)). Một câu hỏi tương tự đã được đăng trong How to chain a Celery task that returns a list into a group? nhưng nó không giải thích làm thế nào để vượt qua đầu ra từ nhóm đến nhiệm vụ tiếp theo trong chuỗi.

@task 
def getRange(x): 
    return range(x) 

@task 
def double(nr): 
    return nr*2 

@task 
def xsum(list): 
    return sum(list) 

Trả lời

5

Tôi không tin rằng có một cách để làm điều đó với nguyên thủy hiện tại trong một chuỗi. Việc chuyển các cuộc gọi lại như trong câu hỏi bạn đề cập sẽ không cho phép bạn nghe khi các tác vụ của nhóm đã kết thúc. Gần nhất bạn có thể nhận được là cái gì đó như:

@task 
def get_range(x): 
    return range(x) 

@task 
def mapper(nr): 
    return nr * 2 

@task 
def reducer(nrs): 
    return sum(nrs) 

@task 
def double_then_sum(nrs): 
    return (
    group([mapper.s(nr) for nr in nrs]) | 
    reducer.s() 
)() 

ar = (get_range.s(3) | double_then_sum.s())() # call the procedure 
ar.result.result # get the result 

Nếu không, bạn có thể thử sử dụng dynamic chaining, mà sẽ dẫn đến một giải pháp đơn giản hơn, hoặc chỉ sử dụng map nếu bạn không cần phải nhiệm vụ nhóm của bạn để chạy song song.

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