gpt4 book ai didi

multithreading - 是否可以按随机顺序执行 celery 任务?

转载 作者:可可西里 更新时间:2023-11-01 11:00:35 25 4
gpt4 key购买 nike

给定:

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

问题:

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

最佳答案

没有队列是先进先出的,不能从中随机选择。

Or create a custom celery backend where SET is used to store tasks instead of 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'

您可以决定为每种任务并行处理多少个 worker :

任务“a”的可扩展性很强,可以启动很多 worker

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

关于multithreading - 是否可以按随机顺序执行 celery 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25878385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com