Python-从另一个队列重试失败的芹菜任务

Python-从另一个队列重试失败的芹菜任务,python,celery,django-celery,Python,Celery,Django Celery,我正在用芹菜向web服务发布数据。有时,由于internet已关闭,数据未发布到web服务,任务将无限次重试,直到发布为止。不需要重试该任务,因为网络已关闭,因此无需再次重试 我想到了一个更好的解决方案,即如果一个任务失败三次(重试三次),那么它将被转移到另一个队列。此队列包含所有失败任务的列表。 现在,当internet启动并通过网络发布数据时,即任务已从正常队列中完成,然后它开始处理任务失败队列中的任务。 这将不会浪费CPU内存来反复重试任务 以下是我的代码:-到目前为止,我只是再次尝试这项

我正在用芹菜向web服务发布数据。有时,由于internet已关闭,数据未发布到web服务,任务将无限次重试,直到发布为止。不需要重试该任务,因为网络已关闭,因此无需再次重试

我想到了一个更好的解决方案,即如果一个任务失败三次(重试三次),那么它将被转移到另一个队列。此队列包含所有失败任务的列表。 现在,当internet启动并通过网络发布数据时,即任务已从正常队列中完成,然后它开始处理任务失败队列中的任务。 这将不会浪费CPU内存来反复重试任务

以下是我的代码:-到目前为止,我只是再次尝试这项任务,但我怀疑这是否是正确的方法

@shared_task(default_retry_delay = 1 * 60, max_retries = 10)
def post_data_to_web_service(data,url):

    try : 
        client = SoapClient(
                            location = url,
                            action = 'http://tempuri.org/IService_1_0/',
                            namespace = "http://tempuri.org/", 
                            soap_ns='soap', ns = False
                            )

        response= client.UpdateShipment(
                                        Weight = Decimal(data['Weight']), 
                                        Length = Decimal(data['Length']), 
                                        Height = Decimal(data['Height']), 
                                        Width =  Decimal(data['Width']) , 
                                        )

    except Exception, exc:
        raise post_data_to_web_service.retry(exc=exc) 
如何同时维护两个队列并尝试从这两个队列执行任务

设置.py

BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

默认情况下,芹菜将所有任务添加到名为
cellery
的队列中。因此,您可以在此处运行任务,当出现异常时,它会重试,一旦达到最大重试次数,您可以将它们转移到新队列,例如
foo

from celery.exceptions import MaxRetriesExceededError

@shared_task(default_retry_delay = 1 * 60, max_retries = 10)
def post_data_to_web_service(data,url):
    try:
        #do something with given args

 except MaxRetriesExceededError:
        post_data_to_web_service([data, url], queue='foo')

 except Exception, exc:
        raise post_data_to_web_service.retry(exc=exc) 
当您启动worker时,此任务将尝试使用给定数据执行某些操作。如果失败,它将以60秒的时间重试10次。然后,当它遇到
MaxRetrieseXceederRor
时,它将相同的任务发布到新队列
foo

要使用这些任务,您必须启动一个新的工作人员

celery worker -l info -A my_app -Q foo
或者,如果您使用默认辅助进程启动此任务,也可以使用该任务

 celery worker -l info -A my_app -Q celery,foo