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

Multithreading 是否可以以随机顺序执行芹菜任务?,multithreading,redis,celery,Multithreading,Redis,Celery,鉴于: 任务以aaabbccc格式进入队列,其中字母是一个任务,它可以访问自己的、在同类任务之间共享的资源。执行任务的工人不止一个,但远远少于任务的数量。我们不希望从工人的无敌舰队那里获得过多的共享资源。理想的解决方案是一次执行不同的任务,而不是相同的任务。这里我看到的最好的解决方案是以某种方式从队列中获取一个随机任务,从而减少共享相同资源的机会 问题: 有没有办法控制工人的任务消耗?或者创建一个自定义芹菜后端,其中SET用于存储任务而不是列表?没有队列是FIFO,不能从中随机选取 或者创建一个

鉴于:

任务以aaabbccc格式进入队列,其中字母是一个任务,它可以访问自己的、在同类任务之间共享的资源。执行任务的工人不止一个,但远远少于任务的数量。我们不希望从工人的无敌舰队那里获得过多的共享资源。理想的解决方案是一次执行不同的任务,而不是相同的任务。这里我看到的最好的解决方案是以某种方式从队列中获取一个随机任务,从而减少共享相同资源的机会

问题:


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

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

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

你的意思是AABBBCCC的任务与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'
您可以决定每种任务在Parralege中需要多少工人:

任务“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

在将任务放入芹菜之前,您可以创建一个临时数据库来存储任务。现在,从数据库中,您可以根据需要发送任务。