假设:
任务以aaaBBBccc格式进入队列(其中letter是访问自己的任务,在相同类型的任务,资源之间共享)。执行任务的工人不止一个,但比任务数量少得多。不希望从工作队的armada重载共享资源。理想的解决方案是一次执行不同的任务,从不相同。我看到的最佳解决方案是以某种方式从队列中获取随机任务,从而减少共享相同资源的机会。
问题:
有没有办法控制工人的任务消耗?或者创建一个自定义芹菜后端,其中SET用于存储任务而不是LIST?
答案 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