rabbitmq 后台Celery worker在手动启动时在1个任务上抛出错误,但worker没有

ct3nt3jp  于 2023-03-30  发布在  RabbitMQ
关注(0)|答案(2)|浏览(154)

我正在尝试解决我在应用程序中处理的一个不方便的问题。我设置了一个Celery守护进程,与手动启动worker时的平滑进程相比,它在链中的1个任务上的行为似乎有所不同。
此任务尝试从URL列表中下载图片并保存它们,但守护进程在某个时候抛出一些“TimeLimitExceeded”。我肯定可以手动运行worker(例如在screen中),但这样我就会失去守护进程及其日志的灵活性...
为了解决这个问题,我用(bind=True)设置了这个任务,并实现了一个try/except,如果这个特定的错误发生,它会重试这个任务(参见Celery文档)。

@celery.task(bind=True)
def fetch_img(self, datasetId):

    list_imgs = retrieve_imgs(datasetId)    # list of pair url + new filepath
    total = len(list_imgs)
    for p in range(len(list_imgs)):
        url = list_imgs[p][0]
        filepath = list_imgs[p][1]
        filename = os.path.basename(filepath)

        try:
            fetch_img = fetchUrl(url, filepath)
            if fetch_img[0] is True:            # download picture
                # message
                mesPic_part1 = '\n' + "# Url '" + url + "' successfully fetched"
                mesPic_part2 = '\n' + "--> File saved as '.../" + datasetId + '/' + filename + "'"
                list_parts = [mesPic_part1, mesPic_part2]
                downloaded += 1

            else:
                # get error message if download failed
                list_parts = [fetch_img[1]]

            # Message(s)
            for m in list_parts:
                log_message_line(m)

        except TimeLimitExceeded as exc:
            raise self.retry(countdown=60, exc=exc)

    return datasetId

但它并没有改善......当守护进程出现问题时,日志给予:

[2019-07-23 18:44:24,691: ERROR/MainProcess] Task handler raised error: TimeLimitExceeded(300.0,)
Traceback (most recent call last):
  File "/opt/some/path/app/venv/lib/python3.6/site-packages/billiard/pool.py", line 658, in on_hard_timeout
    raise TimeLimitExceeded(job._timeout)
billiard.exceptions.TimeLimitExceeded: TimeLimitExceeded(300.0,)
[2019-07-23 18:44:24,694: ERROR/MainProcess] Hard time limit (300.0s) exceeded for application.core.celery.etl.task_etl_fetchImg.fetch_img[5cdce7d5-6ab2-425b-a1dd-5d847e3d403e]

你有过类似的经历吗?如果你碰巧有一些提示,我会很高兴...提前谢谢你!

3zwjbxry

3zwjbxry1#

您收到TimeLimitExceeded异常,因为任务的执行时间超过了300秒。300秒是任务可以运行的默认时间。
您可以通过这样做来增加任务的time_limit(以秒为单位)。

@celery.task(time_limit=20)
def mytask():
    do_something()

您还可以使用以下命令在配置中设置任务的时间限制:

CELERY_ANNOTATIONS = {'module.mytask': {'time_limit': 20}}
g6baxovj

g6baxovj2#

更好的方法

from celery import shared_task
@shared_task(soft_time_limit=1200,time_limit=1300)

这给予了足够的时间来运行任务,软限制time_limit之前清理任务

相关问题