我目前正在构建一个应用程序,该应用程序会基于一些输入来运行某些扫描。
我遇到的问题是某些扫描正在形成瓶颈,我想知道是否有办法为这些任务实现不同的线程/工人。
我会再多说一点。
我用命令启动我的工作者
pipenv run celery -A proj worker -B -l info
### Tasks.py ###
@shared_task
def short_task_1():
return
@shared_task
def short_task_2():
return
@shared_task
def long_task_1():
return
### handler.py ###
def handle_scan():
short_task_1.delay()
short_task_2.delay()
long_task_1.delay()
我发现一种可能的解决方案是将短期任务分配给一个工人,将较长的任务分配给另一个工人。但是我无法在文档中找到如何使用delay()
命令将任务分配给哪个工作程序的方法。
请其他工作人员处理此任务会有所帮助吗?如果有其他解决方案,那么最好的方法是什么?
答案 0 :(得分:1)
我最终做了以下事情
如果您尝试使用多个任务队列,则 delay()
不起作用。主要是因为仅在使用“默认”队列时才使用delay()
。要使用多个队列,必须使用apply_async()
。
例如,如果使用.delay(arg1, arg2)
调用了任务
现在(考虑到多个队列),需要使用.apply_async(args=[arg1,arg2], queue='queue_name')
因此,这是我终于做到了,这要归功于@DejanLekic
tasks.py
@shared_task
def short_task_1():
return
@shared_task
def short_task_2():
return
@shared_task
def long_task_1():
return
与以前相同。但这是新的处理程序
def handle_scan():
# Fast queue with args if required
short_task_1.apply_async(args=[arg1, arg2], queue='fast_queue')
short_task_2.apply_async(args=[arg1, arg2], queue='fast_queue')
# slow queue
long_task_1.apply_async(args=[arg1, arg2], queue='slow_queue')
我通过执行以下操作(注意pipenv)来启动工作程序:
pipenv run celery -A proj worker -B --loglevel=info -Q slow_queue,fast_queue