Python 排队处理大量芹菜任务

Python 排队处理大量芹菜任务,python,celery,Python,Celery,我正在使用芹菜分布式任务调度库编写一个python3应用程序。 工人们正在使用greenlet线程进行处理。该任务是与网络操作相关的I/O 我需要将大量芹菜任务作为单个组插入。在这种情况下,一次大约有10000(10k)个URL,每个URL都是单独的芹菜任务 在本地主机上运行redis或rabbitmq的情况下,以单个组的形式进行插入几乎需要12秒。这太长了 Q:有没有办法用芹菜优化这种批量插入? 在其他线程中,我发现有人反对使用块,但是当我在块中提交块时,单个块在单个线程中处理(不使用gree

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

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

在本地主机上运行redis或rabbitmq的情况下,以单个组的形式进行插入几乎需要12秒。这太长了

Q:有没有办法用芹菜优化这种批量插入?

在其他线程中,我发现有人反对使用块,但是当我在块中提交块时,单个块在单个线程中处理(不使用greenlet,这是必要的,因为它阻止了工作操作上的IO)。这会导致性能下降。考虑下面的数字:

  • 无块:插入12秒,处理9秒
  • 对于块:插入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秒

    芹菜实际上有一个名为Group和Chunk的任务包装器

    我认为Chunk需要一个结果后端,但只要将您的任务分成50到200个URL的组,就可以让芹菜为您进行优化


    但是,如果您正在执行10000个网络绑定任务,那么这将需要一秒钟的时间。

    我不知道为什么您会用我知道的内容作为初始post状态来回答。它提到了组和块。块在这种情况下不起作用,因为块杀死了网络eventlet并发的可能性。这是一个公平的问题。然而,如果你坚持吃芹菜,就没有其他选择了。我不知道如何在芹菜中进行配置,但这可能是一个好的谷歌。将工人数量增加到某个较大的数字也可能有效。Asyncio也可能更好,因为每个工作进程可能在触发下一个请求之前等待响应。