我有以下任务:
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函数返回一个合并的数据集。
我不知道如何在芹菜中使用画布。
感谢您的帮助。
答案 0 :(得分:3)
在您的情况下,您必须致电get_filters()
,等待结果并将其传递给get_customers
内的get_orders
,get_returns
,chord
个签名,并使用新功能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在任务之间传递它们。