如何将大块数据传递给芹菜

时间:2017-01-31 11:32:02

标签: python numpy serialization redis celery

我正在使用芹菜工作者从我的机器学习模型中获取结果。

我正在做的是从客户端向芹菜任务发送大块numpy数组(几兆字节)并返回。

目前,我将客户端numpy数组序列化为base64。当我在客户端或芹菜工作者上直接从/向Redis存储/获取数据时,系统的性能比/当我让celery完成所有参数传递(numpy的base64)时快得多。

我想使用celery(带有' redis' broker)来传递args / numpy数组而不是直接在客户端中使用redis。你知道哪里有问题吗?如何设置芹菜的配置以更有效地执行此操作(在客户端 - > broker-> worker之间传递数据并返回到客户端)。

        serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring()
        serialized = base64.b64encode(serialized)
        #self.redis.set(key, serialized)

        print('calling celery processor')
        result = self.celery.send_task('process', args=[number_of_records, serialized], kwargs={})
        returncode, result = result.get(timeout=1000, interval=0.1) 

vs(这是更快,直接使用redis存储):

        serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring()
        serialized = base64.b64encode(serialized)
        self.redis.set(key, serialized)

        print('calling celery processor')
        result = self.celery.send_task('process', args=[number_of_records, key], kwargs={})
        returncode, result = result.get(timeout=1000, interval=0.1) 

        resultc= self.redis.get(key)

有关芹菜的序列化,配置设置,......的任何提示?我希望这个系统快速而简单。我应该直接使用redis,就像在第二个例子中那样吗?

1 个答案:

答案 0 :(得分:1)

Celery使用JSON或cPickle来序列化消息。所以可能发生的事情是你要两次序列化 - 首先是base64(效率低下),然后是JSON或cPickle。

您是否尝试完全跳过base64编码并让Celery处理它?<​​/ p>

您可以使用此代码告诉Celery使用cPickle(更高效)而不是JSON(默认值):

app.conf.task_serializer = 'pickle'
app.conf.result_serializer = 'pickle'