首页 > 解决方案 > Django celery 任务卡在阻塞链上

问题描述

我正在使用带有 python 3.5 的芹菜。我正在使用链执行序列化任务,我只想一次处理单个任务。
以下代码工作正常:

@shared_task(name='dummy1')
def dummy1(val):
    logger.info('received: ' + val)

    with RedisLock('testing.pid',60*60):
        try:
            logger.info("Lock acquired by " + val)

            res = chain(dummy2.s(val), dummy3.s(val)).delay()
            logger.info("Lock released")
        except Exception as e:
            logger.exception(str(e))


@shared_task(name='dummy2')
def dummy2(val):
    logger.info('Dummy2 : ' + val)
    time.sleep(3)
    logger.info('Dummy2 complete')
    return None


@shared_task(name='dummy3')
def dummy3(prev, val):
    logger.info('Dummy3 : ' + val)
    time.sleep(3)
    logger.info('Dummy3 complete')

RedisLock 是一种基于分布式缓存的锁,用于一次运行单个任务。

但是,当我这样做时:

    with RedisLock('testing.pid',60*60):
        try:
            logger.info("Lock acquired by " + val)

            res = chain(dummy2.s(val), dummy3.s(val)).delay()

            res.get()  # blocking the process here
            logger.info("Lock released")

链条无法按预期工作并且经常崩溃。

标签: djangolockingtaskcelery

解决方案


推荐阅读