首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

如何将类成员方法作为celery任务?

  •  
  •   kenneth · 2013-07-14 21:42:29 +08:00 · 2427 次点击
    这是一个创建于 2141 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想将类成员方法作为celery task,但是后端没有收到消息。
    求方法,我试了几次不行,不知道哪里错了
    19 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    gfreezy   2013-07-14 22:09:14 +08:00
    新写一个function作为celery_task,里面调用 类成员方法
        2
    yishenggudou   2013-07-15 10:38:40 +08:00   ♥ 1
    celery 太折腾 不推荐
        3
    zhenyi2697   2013-07-15 14:27:27 +08:00
    @yishenggudou 那消息队列有什么推荐的呢?
        5
    kenneth   2013-07-15 15:09:29 +08:00
    @ritksm 这篇文章我看到了,但是我没能成功,broker还是没有收到消息。
        6
    ritksm   2013-07-15 15:20:14 +08:00
    @kenneth 检查配置、检查log、检查调用的shell命令、贴出代码。要不然别人怎么发现你的问题?
        7
    kenneth   2013-07-15 15:23:46 +08:00
    class A:
    def __init__(self, feed):

    @celery.task
    def process(self):
    return

    a = A()
    a.process.delay(feed)

    @ritksm 但是不行。高手们帮看下。
        8
    wenbinwu   2013-07-15 15:26:44 +08:00
    @kenneth 你的代码貌似没参考@ritksm 给你的文档啊
        9
    kenneth   2013-07-15 15:29:04 +08:00
    @wenbinwu 已经给出了关键信息了,就是调用类方法作为任务,这就是核心问题。
        10
    wenbinwu   2013-07-15 15:30:22 +08:00
    @kenneth 你再读一下那个连接。。。
        11
    kenneth   2013-07-15 15:32:21 +08:00
    @wenbinwu 读过了,还是不知道问题在哪里?
        12
    wenbinwu   2013-07-15 15:33:57 +08:00
    @kenneth 你按照第一个例子改一下,别用 ` @celery.task `
        13
    kenneth   2013-07-15 15:39:38 +08:00
    @wenbinwu

    Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/celery/task/trace.py", line 233, in trace_task
    R = retval = fun(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/celery/task/trace.py", line 420, in __protected_call__
    return self.run(*args, **kwargs)
    None: process() takes exactly 1 argument (0 given)
        14
    ritksm   2013-07-15 15:45:33 +08:00
    参见以下代码:
    from celery import Celery
    from celery.contrib.methods import task_method

    celery = Celery('xxxxx', broker='xxxxxx')

    class A(object):

    @celery.task(filter=task_method)
    def process(self):
    print('ok')
    return
        15
    kenneth   2013-07-15 15:51:12 +08:00
    @ritksm 试了,这种方法就根本收不到消息,跑都不跑。
        16
    ritksm   2013-07-15 15:53:21 +08:00
    如何不跑了。。。我咋就可以出结果。。。难道要我截图出来么。。。错误信息?shell是如何调用celery的。。。
        17
    kenneth   2013-07-15 15:55:24 +08:00
    @ritksm 没有错误,只是worker收不到job。我们加下Gtalk交流吧:kenneth1982@gmail.com
        18
    Archangel_SDY   2013-07-15 16:51:22 +08:00
    看看broker的log呢?

    上次被RabbitMQ的1G磁盘剩余空间要求坑了整整一晚上...
        19
    zhenyi2697   2013-07-15 20:25:07 +08:00
    @kenneth 貌似调用celery需要task所在的module是一个celerymodule

    也就是说,你需要先运行 celery = Celery('xxxxx', broker='xxxxxx') 创建一个celery的app,然后再写你的task。
    另外,你需要运行一个celery的worker,参考 celery -A app_name worker --loglevel=info
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2203 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 12:09 · PVG 20:09 · LAX 05:09 · JFK 08:09
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1