我的芹菜从amqp开始

     -------------- celery@tty-Gazelle-Professional v3.0.19 (Chiastic Slide)
     ---- **** -----
     --- * ***  * -- Linux-3.8.0-25-generic-x86_64-with-Ubuntu-13.04-raring
     -- * - **** ---
     - ** ---------- [config]
     - ** ---------- .> broker:      amqp://guest@localhost:5672//
     - ** ---------- .> app:         proj.celery:0x25ed510
     - ** ---------- .> concurrency: 8 (processes)
     - *** --- * --- .> events:      OFF (enable -E to monitor this worker)
     -- ******* ----
     --- ***** ----- [queues]
     -------------- .> celery:      exchange:celery(direct) binding:celery


有一个功能:

    def prime(n):
        .....
        .....
        return number_of_primes_below_n


所以我将此功能作为celery的一项任务,并与串行计算进行了比较

序列号:

    [prime(i) for i in xrange(10, 100000)]


与芹菜平行:

    from celery import *

    g = group(prime.s(i) for i in xrange(10, 100000))
    res = g.apply_async()


当我apply_async()时,后端中的结果很快显示在终端屏幕上,如下所示:

[2013-06-20 16:34:56,238:INFO / MainProcess]任务proj.tasks.do_work [989be06b-c4f3-4876-9311-2f5f813857d5]成功于0.0166230201721s:99640324
[2013-06-20 16:34:56,241:INFO / MainProcess]任务proj.tasks.do_work [6eaa9b85-7ba2-4397-b6ae-cbb5668633d4]成功于0.0123620033264ss:99740169
[2013-06-20 16:34:56,242:INFO / MainProcess]任务proj.tasks.do_work [1f5f6302-94a3-4937-9914-14690d856a5d]成功在0.00850105285645s:99780121
[2013-06-20 16:34:56,244:INFO / MainProcess]任务proj.tasks.do_work [b3735842-a49c-48a3-8a9e-fab24c0a6c23]成功于0.0102620124817s:99820081
[2013-06-20 16:34:56,245:INFO / MainProcess]任务proj.tasks.do_work [98eec31a-52eb-4752-92af-6956c0e6f130]在0.00973200798035s成功:99880036
[2013-06-20 16:34:56,245:INFO / MainProcess]任务proj.tasks.do_work [011a1e99-b307-480b-9765-b1a472dbfa8c]成功于0.0115168094635s:99800100
[2013-06-20 16:34:56,245:INFO / MainProcess]任务proj.tasks.do_work [f3e3a89f-de79-4ab0-aab7-0a71fe2ab2f7]成功于0.010409116745s:99840064
[2013-06-20 16:34:56,246:INFO / MainProcess]任务proj.tasks.do_work [61baef04-03c2-4810-bf6a-ae7aa75b80b4]在0.0112910270691s中成功完成:99860049

但是当我想得到芹菜的结果时

    res.get()


它运行非常慢,比串行运行慢得多。问题是什么?是因为芹菜组的收获缓慢吗?我该如何解决这个问题?

最佳答案

如果您对res.get()操作进行时间设置,您会注意到(我希望这是真的),这总是大约500毫秒。这是因为AsyncResult.get必须每N毫秒轮询一次结果。您可以通过为get,interval提供其他参数来进行调整:

res.get(interval=0.005)


您可以获取更多信息in documentationsource。请注意,Celery不是类RPC通信的最佳解决方案,因为轮询结果会严重影响性能。

My own question

关于python - Celery如何使用Python运行这么慢的多个任务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17225741/

10-15 20:50