【问题标题】:Celery + gevent using only one CPU coreCelery + gevent 仅使用一个 CPU 内核
【发布时间】:2015-06-29 01:36:14
【问题描述】:

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

这是 4 个 Celery 实例的屏幕截图,每个实例有 20 个 gevent 并发

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

这是我的第一个任务:

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 请求和更新数据库。

【问题讨论】:

  • 如果不查看任何代码,很难理解正在发生的事情。你能提供一些吗?
  • 作为一般经验法则,您倾向于远离 Python 上的多线程应用程序,除非它们是 I/O 密集型应用程序,并且您欢迎多进程应用程序相反,除非它们是 I/O 密集型的。可能的情况是,您只有一个进程完成所有繁重的工作,而您没有使用多处理框架做任何事情。
  • 一般来说,你不应该经常用芹菜脱丝。您应该创建新任务并分发它们,而不是尝试使用 gevent 手动执行此操作
  • 但我不是手动使用 gevent,只是使用 -P 参数生成 gevent celery worker。

标签: python celery gevent


【解决方案1】:

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

【讨论】:

  • 在上面的例子中,我启动了 4 个 celery 实例。 celery-multi 在主管上不起作用:/
  • 你可以在supervisor中启动多个worker而不是使用multi,每个指定-P gevent。
  • 是的,我就是这么做的。
猜你喜欢
  • 2020-02-15
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2020-07-05
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
相关资源
最近更新 更多