【问题标题】:Celery Flask --- error: [Errno 111] Connection refusedCelery Flask --- 错误:[Errno 111] 连接被拒绝
【发布时间】:2012-06-07 00:31:50
【问题描述】:

在完成烧瓶芹菜的基本示例之后(据我所知运行良好),我正在尝试将其集成到我自己的项目中。基本上,我在下面使用这个:

from flask import Blueprint, jsonify, request, session
from flask.views import MethodView
from celery.decorators import task

blueprint = Blueprint('myapi', __name__)

class MyAPI(MethodView):

    def get(self, tag):
        return get_resource.apply_async(tag)

@task(name="get_task")
def get_resource(tag):
    pass

使用与示例中相同的设置,我收到此错误:

Traceback (most recent call last):
  File "/x/venv/lib/python2.7/site-packages/flask/app.py", line 1518, in __call__
    return self.wsgi_app(environ, start_response)
  File "/x/venv/lib/python2.7/site-packages/flask/app.py", line 1506, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/x/venv/lib/python2.7/site-packages/flask/app.py", line 1504, in wsgi_app
    response = self.full_dispatch_request()
  File "/x/venv/lib/python2.7/site-packages/flask/app.py", line 1264, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/x/venv/lib/python2.7/site-packages/flask/app.py", line 1262, in full_dispatch_request
    rv = self.dispatch_request()
  File "/x/venv/lib/python2.7/site-packages/flask/app.py", line 1248, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/x/venv/lib/python2.7/site-packages/flask/views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/x/venv/lib/python2.7/site-packages/flask/views.py", line 151, in dispatch_request
    return meth(*args, **kwargs)
  File "/x/api/modules/document/document.py", line 14, in get
    return get_resource.apply_async(tag)
  File "/x/venv/lib/python2.7/site-packages/celery/app/task/__init__.py", line 449, in apply_async
    publish = publisher or self.app.amqp.publisher_pool.acquire(block=True)
  File "/x/venv/lib/python2.7/site-packages/kombu/connection.py", line 657, in acquire
    R = self.prepare(R)
  File "/x/venv/lib/python2.7/site-packages/kombu/pools.py", line 54, in prepare
    p = p()
  File "/x/venv/lib/python2.7/site-packages/kombu/pools.py", line 45, in <lambda>
    return lambda: self.create_producer()
  File "/x/venv/lib/python2.7/site-packages/celery/app/amqp.py", line 265, in create_producer
    pub = self.app.amqp.TaskPublisher(conn, auto_declare=False)
  File "/x/venv/lib/python2.7/site-packages/celery/app/amqp.py", line 328, in TaskPublisher
    return TaskPublisher(*args, **self.app.merge(defaults, kwargs))
  File "/x/venv/lib/python2.7/site-packages/celery/app/amqp.py", line 158, in __init__
    super(TaskPublisher, self).__init__(*args, **kwargs)
  File "/x/venv/lib/python2.7/site-packages/kombu/compat.py", line 61, in __init__
    super(Publisher, self).__init__(connection, self.exchange, **kwargs)
  File "/x/venv/lib/python2.7/site-packages/kombu/messaging.py", line 79, in __init__
    self.revive(self.channel)
  File "/x/venv/lib/python2.7/site-packages/kombu/messaging.py", line 168, in revive
    channel = channel.default_channel
  File "/x/venv/lib/python2.7/site-packages/kombu/connection.py", line 581, in default_channel
    self.connection
  File "/x/venv/lib/python2.7/site-packages/kombu/connection.py", line 574, in connection
    self._connection = self._establish_connection()
  File "/x/venv/lib/python2.7/site-packages/kombu/connection.py", line 533, in _establish_connection
    conn = self.transport.establish_connection()
  File "/x/venv/lib/python2.7/site-packages/kombu/transport/amqplib.py", line 279, in establish_connection
    connect_timeout=conninfo.connect_timeout)
  File "/x/venv/lib/python2.7/site-packages/kombu/transport/amqplib.py", line 89, in __init__
    super(Connection, self).__init__(*args, **kwargs)
  File "/x/venv/lib/python2.7/site-packages/amqplib/client_0_8/connection.py", line 129, in __init__
    self.transport = create_transport(host, connect_timeout, ssl)
  File "/x/venv/lib/python2.7/site-packages/amqplib/client_0_8/transport.py", line 281, in create_transport
    return TCPTransport(host, connect_timeout)
  File "/x/venv/lib/python2.7/site-packages/amqplib/client_0_8/transport.py", line 85, in __init__
    raise socket.error, msg
error: [Errno 111] Connection refused

-->

我正在使用redis,如果我安装rabbitmq,我会收到另一个错误,但我现在不明白这一点——代理应该是redis,但它没有找到它还是什么?谁能给我更多的线索这里发生了什么?我是否需要导入其他内容等。关键是,除了简单的示例之外几乎没有什么,这对我来说毫无意义。

我能确定的最多的是在 Api 模块中无法访问“芹菜”,当它在应用程序级别尝试将数据放在那里时,那里的 celery 属于一些默认值,因为我指的是redis,所以没有安装。只是一个猜测。我无法将信息导入模块,只是确定从应用程序调用任何“celery”(例如,输出 celery.conf)会导致错误——尽管我可以导入 celery.task。

这是应用程序正在使用的代理配置,直接来自示例:

BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = "redis"
CELERY_REDIS_HOST = "localhost"
CELERY_REDIS_PORT = 6379
CELERY_REDIS_DB = 0

编辑:

如果您想观看演示:https://github.com/thrisp/flask-celery-example

事实证明,在您的设置中设置 BROKER_TRANSPORT = 'redis' 对于我传入的任何内容都很重要(对于我在此处和 git 示例中提出的设置),我不完全确定为什么它不在示例位中,但在我添加的位中,但它是 - 没有这个它想将所有内容转储到默认的 ampq 队列中。

EDIT2:

此外,这是一个相当大的问题,使用即将发布的 Celery 版本在与 Flask 一起使用时简化了 10,000 个问题,使所有这些都变得不必要。

【问题讨论】:

  • 您的 redis 工作正常吗?输入 redis-cli。显示代理的配置。
  • redis 工作正常,我已经确定一切正常——我已经将烧瓶芹菜示例构建到当前应用程序中,我制作了一个脚本,可以点击这些网址数千次。在我得到这个的同一个应用程序中,我正在使用的 MethodView 方法中的某些内容无法访问烧瓶芹菜。
  • 我遇到了同样的问题——你介意在你尝试最新的 celery rc 之前发布最终工作的 celeryconfig.py 吗?
  • 啊——没关系,我最终切换到了最新版本。顺便说一句,感谢您使用 Ask 解决这个问题。

标签: python celery flask


【解决方案1】:

你必须配置 redis 来绑定本地主机。在/etc/redis/redis.conf 中,取消注释

bind 127.0.0.1

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2016-01-31
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多