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

2013-07-14 21:42:29 +08:00
 kenneth
想将类成员方法作为celery task,但是后端没有收到消息。
求方法,我试了几次不行,不知道哪里错了
4009 次点击
所在节点    Python
19 条回复
gfreezy
2013-07-14 22:09:14 +08:00
新写一个function作为celery_task,里面调用 类成员方法
yishenggudou
2013-07-15 10:38:40 +08:00
celery 太折腾 不推荐
zhenyi2697
2013-07-15 14:27:27 +08:00
@yishenggudou 那消息队列有什么推荐的呢?
ritksm
2013-07-15 14:33:09 +08:00
kenneth
2013-07-15 15:09:29 +08:00
@ritksm 这篇文章我看到了,但是我没能成功,broker还是没有收到消息。
ritksm
2013-07-15 15:20:14 +08:00
@kenneth 检查配置、检查log、检查调用的shell命令、贴出代码。要不然别人怎么发现你的问题?
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 但是不行。高手们帮看下。
wenbinwu
2013-07-15 15:26:44 +08:00
@kenneth 你的代码貌似没参考@ritksm 给你的文档啊
kenneth
2013-07-15 15:29:04 +08:00
@wenbinwu 已经给出了关键信息了,就是调用类方法作为任务,这就是核心问题。
wenbinwu
2013-07-15 15:30:22 +08:00
@kenneth 你再读一下那个连接。。。
kenneth
2013-07-15 15:32:21 +08:00
@wenbinwu 读过了,还是不知道问题在哪里?
wenbinwu
2013-07-15 15:33:57 +08:00
@kenneth 你按照第一个例子改一下,别用 ` @celery.task `
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)
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
kenneth
2013-07-15 15:51:12 +08:00
@ritksm 试了,这种方法就根本收不到消息,跑都不跑。
ritksm
2013-07-15 15:53:21 +08:00
如何不跑了。。。我咋就可以出结果。。。难道要我截图出来么。。。错误信息?shell是如何调用celery的。。。
kenneth
2013-07-15 15:55:24 +08:00
@ritksm 没有错误,只是worker收不到job。我们加下Gtalk交流吧:kenneth1982@gmail.com
Archangel_SDY
2013-07-15 16:51:22 +08:00
看看broker的log呢?

上次被RabbitMQ的1G磁盘剩余空间要求坑了整整一晚上...
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/75754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX