Celery + gevent只使用一个CPU核心

时间:2015-06-29 01:36:15

标签: python celery gevent

我遇到使用gevent运行Celery的性能负载问题,一切都在我的VPS上运行在同一个核心上。

以下是4个Celery实例的屏幕截图,每个实例具有20个gevent并发{{0}​​}

如何解决这个问题?我做错了什么?

这是我的第一个任务:

def update_sender():
    items = models.Item.objects.filter(active=True).all()
    count = items.count()
    items = [i.id for i in items]
    step = count / settings.WORKERS
    for job in list(chunks(items, step)):
        update_item.apply_async(args=[job])

调用以下子任务:

def update_item(items):
    for item in items:
        try:
            i = models.Item.objects.get(id=item)
            url = "someurl"
            rep = requests.get(url)
            jrep = rep.json()
            tracker = ItemTracker(i, jrep)
            if tracker.skip():
                continue
            if tracker.method1():
                if not tracker.method2():
                    tracker.method3()
                tracker.save()

所有这些都是关于同时执行大量HTTP请求和更新数据库。

1 个答案:

答案 0 :(得分:4)

使用gevent的Celery仍然只使用一个进程,它只是在进程内部启动多个greenlet,但它仍然只是一次执行一个greenlet。要允许使用多个核心,您需要使用celery-multi

之类的东西启动多个芹菜进程