多线程芹菜工作者的任务划分

时间:2020-06-02 14:12:08

标签: python-3.x multithreading celery

我目前正在构建一个应用程序,该应用程序会基于一些输入来运行某些扫描。

我遇到的问题是某些扫描正在形成瓶颈,我想知道是否有办法为这些任务实现不同的线程/工人。

我会再多说一点。

我用命令启动我的工作者

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()命令将任务分配给哪个工作程序的方法。

请其他工作人员处理此任务会有所帮助吗?如果有其他解决方案,那么最好的方法是什么?

1 个答案:

答案 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