簡體   English   中英

Celery 如何用 Python 運行多個任務這么慢?

[英]How do Celery run multiple tasks so slow with Python?

我的芹菜從 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] 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()

它運行得非常非常慢,比串行慢得多。 問題是什么? 是不是因為celery組的獲取結果很慢? 我該如何解決問題?

如果您對 res.get() 操作進行計時,您會注意到(我希望這是真的),這總是大約 500 毫秒。 這是因為AsyncResult.get必須每N毫秒輪詢一次結果。 您可以通過為 get, interval提供附加參數來調整它:

res.get(interval=0.005)  

您可以在文檔來源中獲得更多信息。 請注意,Celery 不是類似 RPC 的通信的最佳解決方案,因為輪詢結果會導致性能下降。

我自己的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM