Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜链不适用于批次_Python_Rabbitmq_Celery_Celery Task - Fatal编程技术网

Python 芹菜链不适用于批次

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

乍一看,我非常喜欢芹菜中的“批处理”功能,因为我需要在调用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(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和一个非常简单的缓冲消息的工作模板。如果有人感兴趣,我有可用的源代码,干杯。