我使用的是Python 2.7(sigh),celery == 3.1.19,librabbitmq == 1.6.1,rabbitmq-server-3.5.6-1.noarch,redis 2.8.24(来自redis- cli info)。
我试图从芹菜生产商向芹菜消费者发送消息,并在生产者处获得结果。有1个生产者和1个消费者,但其中有2个rabbitmq(作为经纪人)和1个redis(结果)。
我面临的问题是:
如果我不尝试从AsyncResult获取结果,那么事情就会奏效!但我有点希望得到电话的结果 - 这很有用:)。
以下是配置细节。
我们按如下方式设置Celery以获得退货:
CELERY_RESULT_BACKEND = 'redis://%s' % _SHARED_WRITE_CACHE_HOST_INTERNAL
CELERY_RESULT = Celery('TEST', broker=CELERY_BROKER)
CELERY_RESULT.conf.update(
BROKER_HEARTBEAT=60,
CELERY_RESULT_BACKEND=CELERY_RESULT_BACKEND,
CELERY_TASK_RESULT_EXPIRES=100,
CELERY_IGNORE_RESULT=False,
CELERY_RESULT_PERSISTENT=False,
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
)
我们有另一个Celery配置,它不会期望返回值,并且可以在同一程序中运行。它看起来像:
CELERY = Celery('TEST', broker=CELERY_BROKER)
CELERY.conf.update(
BROKER_HEARTBEAT=60,
CELERY_RESULT_BACKEND=CELERY_BROKER,
CELERY_TASK_RESULT_EXPIRES=100,
CELERY_STORE_ERRORS_EVEN_IF_IGNORED=False,
CELERY_IGNORE_RESULT=True,
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
)
芹菜生产商的存根看起来像:
@CELERY_RESULT.task(name='ZipUp', exchange='cognition.workflow.ZipUp_%s' % INTERNAL_VERSION)
def ZipUp(directory): # pylint: disable=invalid-name
""" Task stub """
_unused_directory = directory
raise NotImplementedError
有人提到在这个存根中使用queue =而不是exchange =会更简单。任何人都可以确认(我用Google搜索但在主题上找不到任何内容)?显然你可以使用queue =除非你想使用扇出或类似的东西,因为并非所有的芹菜后端都有交换的概念。
无论如何,芹菜消费者开始时:
@task(queue='cognition.workflow.ZipUp_%s' % INTERNAL_VERSION, name='ZipUp')
@StatsInstrument('workflow.ZipUp')
def ZipUp(directory): # pylint: disable=invalid-name
'''
Zip all files in directory, password protected, and return the pathname of the new zip archive.
:param directory Directory to zip
'''
try:
LOGGER.info('zipping up {}'.format(directory))
但是"拉上"无法在任何地方登录。我在芹菜服务器上搜索了该字符串的每个(磁盘支持的)文件,并获得了两个命中:/ usr / bin / zip和我的芹菜任务的代码 - 并且没有日志消息。
有什么建议吗?
感谢阅读!
答案 0 :(得分:0)
似乎在制作人中使用以下任务存根解决了问题:
http://localhost:8080/testdomain/registeruser.do?mylocation=fr
简而言之,它使用queue =而不是exchange =。