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

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

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

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

我想使用celery(带有’redis’代理)来传递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,就像在第二个例子中那样吗?

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

您是否尝试完全跳过base64编码并让Celery处理它?

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

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