V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Exits
V2EX  ›  Python

Celery Rabbitmq 文件传递问题请教

  •  
  •   Exits · 2019-05-07 22:20:15 +08:00 · 2121 次点击
    这是一个创建于 2062 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:web 应用,有几个非常耗时任务(基于深度学习算法,时间复杂度高)需要通过分发请求任务到服务器结点 A、B、C 上,提交任务时需要文件(数据集),执行完后生成文件,需要将 A、B、C 结果文件统一存放在 A 上

    框架:本人使用 Django+Celery+rabbitmq 进行任务分发,问题在于 django 接收的 request 中 FILE 如何传递给 rabbitmq,而执行完任务后结果文件如何写回到 A 中?

    配置

    A B C: broker: amqp://A  backend: amqp://A
    A broker  B: worker   C: worker
    

    相关代码:

    celery: A demo/demo/celery.py

    A demo/web/view.py

    def handle_upload_como(request): 
        ...
        dataset = request.FILE.get("data", None)
        ...
    	//这里传递文件 dataset 不能成功
        res = taskA.delay(dataset, args)
        res.ready()
    	//获取结果文件 resf
    	//写入 resf 到 A 结点的统一存储路径中
        ...
    

    A demo/web/task.py

    @share_app
    def taskA(data, args):
        ...
        run(data,args)
        ...
        //result 写在路径: /var/www/result/中,存储结点为当前执行任务结点
        //如何返回 result 结果
        return 'ok'
    

    若上述配置有误,也请多多指正,上述问题应如何解决呢?

    qyb
        1
    qyb  
       2019-05-07 22:36:04 +08:00
    A 提供一个 NFS server,传递文件路径过去
    Exits
        2
    Exits  
    OP
       2019-05-07 23:35:52 +08:00
    我查了下 Stack Overflow,解决方法有以下几种:
    1.rabbitmq 不支持文件传输,但支持 json 传输,所以可以用 json.dump({'data':encode(dataset)})传输,B 端进行反序列化解码
    2.如 @qyb 所说,传递 A:file/to/path,BC 远程复制读取
    3.文件内容解析为 xml 或 json 传输
    方法略有缺点,若有更好的方法或者更好的架构框架或者基于 django 的分布式框架也可以讨论一二
    cranelee13
        3
    cranelee13  
       2019-05-08 09:35:14 +08:00 via iPhone
    1. json 序列化数据后传输,节点拿到后反序列化后执行。

    2. 提供 http 下载接口,celery 可以分发任务让节点通过 http 下载对应数据集。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2616 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:29 · PVG 19:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.