芹菜如何在Python中以如此缓慢的速度运行多个任务?

芹菜如何在Python中以如此缓慢的速度运行多个任务?,python,celery,Python,Celery,我的芹菜是从amqp开始的 -------------- celery@tty-Gazelle-Professional v3.0.19 (Chiastic Slide) ---- **** ----- --- * *** * -- Linux-3.8.0-25-generic-x86_64-with-Ubuntu-13.04-raring -- * - **** --- - ** ---------- [config] - **

我的芹菜是从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
所以我把这个函数作为芹菜中的一个任务,并与串行计算进行了比较

连载:

    [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()
当我应用_async时,在后端,结果会很快显示在终端屏幕上,如:

[2013-06-20 16:34:56,238: INFO/MainProcess] Task proj.tasks.do_work[989be06b-c4f3-4876-9311-2f5f813857d5] succeeded in 0.0166230201721s: 99640324
[2013-06-20 16:34:56,241: INFO/MainProcess] Task proj.tasks.do_work[6eaa9b85-7ba2-4397-b6ae-cbb5668633d4] succeeded in 0.0123620033264s: 99740169
[2013-06-20 16:34:56,242: INFO/MainProcess] Task proj.tasks.do_work[1f5f6302-94a3-4937-9914-14690d856a5d] succeeded in 0.00850105285645s: 99780121
[2013-06-20 16:34:56,244: INFO/MainProcess] Task proj.tasks.do_work[b3735842-a49c-48a3-8a9e-fab24c0a6c23] succeeded in 0.0102620124817s: 99820081
[2013-06-20 16:34:56,245: INFO/MainProcess] Task proj.tasks.do_work[98eec31a-52eb-4752-92af-6956c0e6f130] succeeded in 0.00973200798035s: 99880036
[2013-06-20 16:34:56,245: INFO/MainProcess] Task proj.tasks.do_work[011a1e99-b307-480b-9765-b1a472dbfa8c] succeeded in 0.0115168094635s: 99800100
[2013-06-20 16:34:56,245: INFO/MainProcess] Task proj.tasks.do_work[f3e3a89f-de79-4ab0-aab7-0a71fe2ab2f7] succeeded in 0.010409116745s: 99840064
[2013-06-20 16:34:56,246: INFO/MainProcess] Task proj.tasks.do_work[61baef04-03c2-4810-bf6a-ae7aa75b80b4] succeeded in 0.0112910270691s: 99860049
但是当我想得到芹菜的结果时

    res.get()

它运行得非常慢,比串行的慢得多。有什么问题?是不是因为芹菜组的结果很慢?我如何解决这个问题?

如果您对它的res.get操作进行计时,您会注意到我希望它是真的,这通常是500毫秒左右。这是因为AsyncResult.get必须每N毫秒轮询一次结果。您可以通过为get、interval提供附加参数来调整此值:

您可以获得更多信息和帮助。请注意,芹菜不是RPC类通信的最佳解决方案,因为轮询结果会对性能造成很大影响


如果您使用timeit res.get操作,您会注意到我希望它是真的,这总是大约500毫秒。这是因为AsyncResult.get必须每N毫秒轮询一次结果。您可以通过为get、interval提供附加参数来调整此值:

您可以获得更多信息和帮助。请注意,芹菜不是RPC类通信的最佳解决方案,因为轮询结果会对性能造成很大影响



如果你需要更快的速度,只需增加更多的工人。工人也可以在其他机器上运行。这就是使用AMQP的全部意义所在,如果你不被允许在这个问题上使用硬件,也许芹菜太过分了。@PauloScardine非常感谢你Paulo,正如你从顶部看到的,并发:8个进程,我可以添加8个工作人员来完成这个组吗?感谢如果它是CPU密集型的,那么运行的工作线程数就没有必要超过您的内核数-如果您有其他机器可用,请使用它们,在其他主机上使用AMQP服务器的真实IP地址而不是本地主机不要在每台机上运行一台AMQP服务器,请将所有机器指向同一台服务器。如果它是I/O密集型的,请在I/O等待时间低于vmstat 10的最后一列1或2时继续向上泵送它。@PauloScardine我又添加了两个工人,实际上每个工人都计算自己的部分,这意味着它并行运行,在后端我可以看到打印结果。但是,当我执行res.ready或res.get时,它总是挂在那里,但我确信所有工作人员都完成了他们的部分。为了获得更大的结果,在队列中维护状态可能会花费更高的成本,您可以尝试将其存储在数据库中。如果您需要更高的速度,只需添加更多工作人员。工人也可以在其他机器上运行。这就是使用AMQP的全部意义所在,如果你不被允许在这个问题上使用硬件,也许芹菜太过分了。@PauloScardine非常感谢你Paulo,正如你从顶部看到的,并发:8个进程,我可以添加8个工作人员来完成这个组吗?感谢如果它是CPU密集型的,那么运行的工作线程数就没有必要超过您的内核数-如果您有其他机器可用,请使用它们,在其他主机上使用AMQP服务器的真实IP地址而不是本地主机不要在每台机上运行一台AMQP服务器,请将所有机器指向同一台服务器。如果它是I/O密集型的,请在I/O等待时间低于vmstat 10的最后一列1或2时继续向上泵送它。@PauloScardine我又添加了两个工人,实际上每个工人都计算自己的部分,这意味着它并行运行,在后端我可以看到打印结果。然而,当我执行res.ready或res.get时,它总是挂在那里,但我确信所有工作人员都完成了他们的部分。为了获得更大的结果,在队列中维护状态可能会花费很多,您可以尝试将其存储在数据库中。请注意,即将发布的芹菜3.1中有一个新的“rpc”后端,它为此进行了优化:即,它是非持久性的,只有启动任务的进程才能检索结果请求应答pattern@asksol非常感谢。你能给出一些链接/例子说明这个“rpc”后端是如何工作的吗?我在文档中没有找到任何内容。这是对文档中不容易找到的内容的一个很好的回答。请注意,即将发布的芹菜3.1中有一个新的“rpc”后端,它为此进行了优化:即,它是非持久性的,只有启动任务的进程才能检索结果请求回复pattern@asksol,非常感谢。你能给出一些链接/例子说明这个“rpc”后端是如何工作的吗?我在文档中没有找到任何东西。这是对文档中不容易找到的东西的一个很好的回答。
res.get(interval=0.005)