使用celery分发顺序python代码

时间:2014-05-26 16:11:38

标签: celery

我有以下任务:

get_filters() # returns a list of filters
get_customers(filter_a, filter_b) # returns a pandas DataFrame containing customers
get_orders(filter_a, filter_b) # returns a pandas DataFrame of customers and aggregate purchase statistics
get_returns(filter_a, filter_b) # returns a pandas DataFrame of customers and aggregate return statistics 

顺序代码的工作原理如下:

def extract_customer():
    filt_a, filt_b = get_filters()
    cust = get_customers(filt_a, filt_b)
    ord = get_orders(filt_a, filt_b)
    ret = get_returns(filt_a, filt_b)
    merged = cust.join([ord, ret])

我想用芹菜分发任务,以便首先执行get_filters,然后执行get_customers,get_orders& get_returns并发执行。最后,当它们完成执行时,merge函数返回一个合并的数据集。

我不知道如何在芹菜中使用画布。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

在您的情况下,您必须致电get_filters(),等待结果并将其传递给get_customers内的get_ordersget_returnschord个签名,并使用新功能merged作为回调。

看看这个:

def extract_customer():
    filt_a, filt_b = get_filters()

    result = chord([
        get_customers.s(filt_a, filt_b),
        get_orders.s(filt_a, filt_b),
        get_returns.s(filt_a, filt_b)
    ])(merged.s())

    result.get()

@shared_task
def merged(args):
    cust, ord, ret = args
    return cust.join([ord, ret])

这里唯一可能出问题的是你从get_ *函数得到什么类型的结果,它们可以通过芹菜经纪人发送。它们应该是可以用json编码的简单对象,或者使用pickle在任务之间传递它们。