我正在使用Celery分布式任务调度库编写python3应用程序。 工人正在使用greenlet线程进行处理。任务是与网络操作有关的I / O。
我需要将大量芹菜任务作为一个组插入。在这种情况下,一次有大约10000(10k)个网址,每个网址都是单独的芹菜任务。
这种插入作为单个组,在本地主机上运行redis或rabbitmq大约需要12秒钟。太长了。
问:有什么方法可以使用芹菜优化这种批量插入吗?
在其他线程中,我发现人们对块的使用有所不同,但是当我将其提交到块中时-单个块在单个线程中进行处理(不利用greenlet,这是必需的,因为阻塞了工人操作上的IO)。这导致性能下降。考虑以下数字:
因此,使用块是不可能的,因为阻塞的网络操作将扼杀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秒
答案 0 :(得分:0)
Celery实际上有一个名为Group and Chunk的任务包装器。
https://docs.celeryproject.org/en/latest/userguide/canvas.html
我认为,Chunk需要一个结果后端,但是将任务分为50至200个URL组应该可以使Celery为您优化。
但是,如果您正在执行10000个网络绑定任务,那么将花费一秒钟。