Celery + gevent 只使用一个 CPU 核心
Celery + gevent using only one CPU core
我的性能负载有问题 运行 Celery 和 gevent,一切都 运行 在我的 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 请求和更新数据库。
带有gevent的Celery仍然只使用一个进程,它只是在进程内部启动多个greenlet,但它仍然一次只执行一个greenlet。要允许使用超过 1 个核心,您需要使用 celery-multi
之类的东西启动多个芹菜进程
我的性能负载有问题 运行 Celery 和 gevent,一切都 运行 在我的 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 请求和更新数据库。
带有gevent的Celery仍然只使用一个进程,它只是在进程内部启动多个greenlet,但它仍然一次只执行一个greenlet。要允许使用超过 1 个核心,您需要使用 celery-multi
之类的东西启动多个芹菜进程