是否可以以随机顺序执行芹菜任务?

时间:2014-09-16 21:03:29

标签: multithreading redis celery

假设:

任务以aaaBBBccc格式进入队列(其中letter是访问自己的任务,在相同类型的任务,资源之间共享)。执行任务的工人不止一个,但比任务数量少得多。不希望从工作队的armada重载共享资源。理想的解决方案是一次执行不同的任务,从不相同。我看到的最佳解决方案是以某种方式从队列中获取随机任务,从而减少共享相同资源的机会。

问题:

有没有办法控制工人的任务消耗?或者创建一个自定义芹菜后端,其中SET用于存储任务而不是LIST?

1 个答案:

答案 0 :(得分:0)

没有队列是FIFO,不能从中随机选择。

  

或者创建一个自定义芹菜后端,其中SET用于存储任务而不是LIST?

你的意思是aaaaBBBccc的任务与aBc相同吗?

在这种情况下,您可以锁定任务,所有其他工作人员在处理时跳过它:

class LockableDwarfTask(BaseDwarfTask):
    abstract = True

    def _lock_key(self):
        return self.__class__.name

    def acquire_lock(self):
       # (use redis/memcache/mongodb), put a key with a ttl
       # if key doest exist, insert it and return True
       # else return false
    end

    def release_lock(self):
       # delete the key

@celery.task(bind=True, base=LockableTask)
def lockedtask():
    if self.acquire_lock():
        try:
            your code
        finally:
            self.release_lock()
     else:
       return 'Task is already processed by an another worker' 

另一种解决方案是将每个任务发送到不同的队列:

queueA: 'aaaa'
queueB: 'BBB'
queueC: 'ccc'

您可以根据每种任务决定您想要多少工人:

任务' a'是非常可扩展的,启动了许多工人

celery worker -n wA -Q queueA -c 24

任务' B'分享资源并且不要扩展那么多

celery worker -n wB -Q queueB -c 4

多项任务' c'不能同时运行:使用taskLock或只生成一个worker

celery worker -n wC -q queueC -c 1
# or with taskLock:
celery worker -n wC -q queueC -c 2