Python 芹菜链不适用于批次
乍一看,我非常喜欢芹菜中的“批处理”功能,因为我需要在调用API之前对大量ID进行分组(否则我可能会被开除) 不幸的是,当进行一点测试时,批处理任务似乎不能很好地与其他画布原语(在本例中为链)配合使用。例如:Python 芹菜链不适用于批次,python,rabbitmq,celery,celery-task,Python,Rabbitmq,Celery,Celery Task,乍一看,我非常喜欢芹菜中的“批处理”功能,因为我需要在调用API之前对大量ID进行分组(否则我可能会被开除) 不幸的是,当进行一点测试时,批处理任务似乎不能很好地与其他画布原语(在本例中为链)配合使用。例如: @a.task(base=Batches, flush_every=10, flush_interval=5) def get_price(requests): for request in requests: a.backend.mark_as_done(requ
@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")
因此,通过这个简单的工作流:
chain(get_price.s("ID_1"), completed.si()).delay()
我看到这个输出:
[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] celery@ultra ready.
[2015-07-11 16:16:34,093: WARNING/Worker-4] filter_by_price ['ID_1']
5秒后,按_price()过滤_将按预期触发。问题是completed()永远不会被调用
你知道这里会发生什么吗?
如果不使用批处理,有什么好的方法可以解决这个问题
PS:我已经设置了
CELERYD\u PREFETCH\u乘数=0
,就像文档所说的那样。看起来批处理任务的行为与正常任务有很大不同。批处理任务甚至不会发出这样的信号
由于您需要在get\u price
之后调用completed
任务,因此您可以直接从get\u price
本身调用它
@a.task(base=Batches, flush_every=10, flush_interval=5)
def get_price(requests):
for request in requests:
# do something
completed.delay()
为了记录在案,我非常需要批处理,结果我只使用RabbitMQ+Pika和一个非常简单的缓冲消息的工作模板。如果有人感兴趣,我有可用的源代码,干杯。