2015-07-11 27 views
11

İlk bakışta, Kerevizde çok fazla "Batches" özelliğini beğendim çünkü bir API çağırmadan önce kimlikleri bir grupta gruplandırmam gerekiyor (aksi halde tekmeleyebilirim).Gruplar ile çalışmayan kereviz zinciri

Maalesef, biraz test ederken, toplu iş görevleri, Tuval ilkelerinin geri kalanıyla, bu durumda zincirlerle iyi bir performans göstermiyor. Örneğin:

@a.task(base=Batches, flush_every=10, flush_interval=5) 
def get_price(requests): 
    for request in requests: 
     a.backend.mark_as_done(request.id, 42, request=request) 
     print "filter_by_price " + str([r.args[0] for r in requests]) 

@a.task 
def completed(): 
    print("complete") 

Yani, bu basit iş akışı ile:

[2015-07-11 16:16:20,348: INFO/MainProcess] Connected to redis://localhost:6379/0 
[2015-07-11 16:16:20,376: INFO/MainProcess] mingle: searching for neighbors 
[2015-07-11 16:16:21,406: INFO/MainProcess] mingle: all alone 
[2015-07-11 16:16:21,449: WARNING/MainProcess] [email protected] ready. 
[2015-07-11 16:16:34,093: WARNING/Worker-4] filter_by_price ['ID_1'] 

5 saniye sonra, filter_by_price() beklendiği gibi tetiklendiğinde:

chain(get_price.s("ID_1"), completed.si()).delay() 

bu çıktıyı bkz. Sorun şu ki tamamlandı() asla çağrılmıyor.

Burada neler olabileceğine dair herhangi bir fikir var mı? Gruplar kullanılmıyorsa, bu sorunu çözmek için iyi bir yaklaşım olabilir mi?

PS:CELERYD_PREFETCH_MULTIPLIER=0'u, belgeler gibi ayarladım.

+0

Sadece kayıt için, RabbitMQ + Pika'yı tek başına, iletileri arabellekleyen çok basit bir çalışan şablonla sonlandırdığım toplu işlere çok ihtiyacım vardı. İlgilenen varsa, kaynak kodum var, şerefe. –

cevap

5

Toplu işlerin davranışı normal görevlerden önemli ölçüde farklı görünüyor. Toplu görevler, task_success gibi sinyal yayınlamıyor bile.

get_price'dan sonra completed görevini aramanız gerektiğinden, doğrudan get_price'un kendisinden de arayabilirsiniz.

@a.task(base=Batches, flush_every=10, flush_interval=5) 
def get_price(requests): 
    for request in requests: 
     # do something 
    completed.delay()