可以使用这样的装饰器:
def single_instance_task(timeout): def task_exc(func): @functools.wraps(func) def wrapper(*args, **kwargs): lock_id = "celery-single-instance-" + func.__name__ acquire_lock = lambda: cache.add(lock_id, "true", timeout) release_lock = lambda: cache.delete(lock_id) if acquire_lock(): try: func(*args, **kwargs) finally: release_lock() return wrapper return task_exc
然后,像这样使用它…
@periodic_task(run_every=timedelta(minutes=1))@single_instance_task(60*10)def fetch_articles() yada yada...



