如果params和任务名称已在服务器中排队,是否可以跳过委托芹菜任务?

Stu*_*Cat 10 python django rabbitmq celery

说我有这个任务:

def do_stuff_for_some_time(some_id):
    e = Model.objects.get(id=some_id)
    e.domanystuff()
Run Code Online (Sandbox Code Playgroud)

而我正在使用它:

do_stuff_for_some_time.apply_async(args=[some_id], queue='some_queue')
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,使用相同的arg参数有很多重复性任务,并且它在队列中令人难以置信.

只有在队列中没有相同的args和相同的任务时才可以应用异步吗?

sta*_*cks 4

celery-singleton解决了这个需求

警告:需要 Redis 代理(用于分布式锁)

pip install celery-singleton

使用Singleton任务基类:

from celery_singleton import Singleton

@celery_app.task(base=Singleton)
def do_stuff_for_some_time(some_id):
    e = Model.objects.get(id=some_id)
    e.domanystuff()
Run Code Online (Sandbox Code Playgroud)


来自文档:

调用 do_stuff.delay() 会将新任务排队或返回当前排队/正在运行的任务实例的 AsyncResult