排队大量芹菜任务

时间:2019-09-01 15:37:25

标签: python celery

我正在使用Celery分布式任务调度库编写python3应用程序。 工人正在使用greenlet线程进行处理。任务是与网络操作有关的I / O。

我需要将大量芹菜任务作为一个组插入。在这种情况下,一次有大约10000(10k)个网址,每个网址都是单独的芹菜任务。

这种插​​入作为单个组,在本地主机上运行redis或rabbitmq大约需要12秒钟。太长了。

问:有什么方法可以使用芹菜优化这种批量插入吗?

在其他线程中,我发现人们对块的使用有所不同,但是当我将其提交到块中时-单个块在单个线程中进行处理(不利用greenlet,这是必需的,因为阻塞了工人操作上的IO)。这导致性能下降。考虑以下数字:

  1. 无块:插入12秒,处理9秒。
  2. 带块:插入3秒,处理27秒。

因此,使用块是不可能的,因为阻塞的网络操作将扼杀greenlet线程的性能优势。

soa = open('input.txt').readlines()
for line in soa:
    line = line.strip()
    s = line.split(':')
    l.append(check.s(s[0], s[1]))
    #l.append(s)
t = time.time()

res = check.chunks(l, 10)()
#print(res.get())
print("Submission taken %f" % (time.time() - t))

exit()

区块结果:提交时间为2.251796秒

l = []

soa = open('input.txt').readlines()

for line in soa:
    line = line.strip()
    s = line.split(':')
    l.append(s)

job = group(l)
t = time.time()
result = job.apply_async()
print("Submission taken %f" % (time.time() - t))

常规结果:提交时间为12.54412秒

1 个答案:

答案 0 :(得分:0)

Celery实际上有一个名为Group and Chunk的任务包装器。

https://docs.celeryproject.org/en/latest/userguide/canvas.html

我认为,Chunk需要一个结果后端,但是将任务分为50至200个URL组应该可以使Celery为您优化。

但是,如果您正在执行10000个网络绑定任务,那么将花费一秒钟。