芹菜:任务单身



我有一个任务,我需要从触发它的网页异步运行。 这个任务运行的时间相当长,由于网页可能会收到很多这样的请求,我希望芹菜在给定时间只运行此任务的一个实例。

有什么方法可以在芹菜本地做到这一点吗? 我很想创建一个数据库表来保存所有要与之通信的任务的这种状态,但这感觉很黑客。

您可能可以为配置为 CELERYD_CONCURRENCY=1 的任务创建一个专用工作线程,然后该工作线程上的所有任务将同步运行

你可以使用 memcache/redis。芹菜官方网站上有一个例子——http://docs.celeryproject.org/en/latest/tutorials/task-cookbook.html

如果你更喜欢 redis(这是一个 Django 实现,但你也可以根据自己的需要轻松修改它):

from django.core.cache import cache
from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)

class SingletonTask(Task):
    def __call__(self, *args, **kwargs):
        lock = cache.lock(self.name)
        if not lock.acquire(blocking=False):
            logger.info("{} failed to lock".format(self.name))
            return
        try:
            super(SingletonTask, self).__call__(*args, **kwargs)
        except Exception as e:
            lock.release()
            raise e
        lock.release()

然后将其用作基本任务:

@shared_task(base=SingletonTask)
def test_task():
    from time import sleep
    sleep(10)

这种认识是无阻塞的。如果您希望下一个任务等待上一个任务,请将blocking=False更改为blocking=True并添加timeout

相关内容

  • 没有找到相关文章

最新更新