You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用eventlet运行Celery无法连接Docker中Redis的问题

Django + Celery(eventlet) 连接Redis超时问题

我在Django中构建Websocket服务,选用Celery实现消息推送。但在线上服务器使用eventlet运行Celery时,出现kombu.exceptions.OperationalError错误,提示连接redis:6379查找超时。使用threads或prefork方式运行Celery则可正常连接Redis。以下是详细信息:

错误堆栈

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/__main__.py", line 15, in main
    sys.exit(_main())
             ^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/bin/celery.py", line 236, in main
    return celery(auto_envvar_prefix="CELERY")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/bin/base.py", line 134, in caller
    return f(ctx, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/bin/worker.py", line 348, in worker
    worker = app.Worker(
             ^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/worker/worker.py", line 93, in __init__
    self.app.loader.init_worker()
  File "/usr/local/lib/python3.12/site-packages/celery/loaders/base.py", line 110, in init_worker
    self.import_default_modules()
  File "/usr/local/lib/python3.12/site-packages/celery/loaders/base.py", line 104, in import_default_modules
    raise response
  File "/usr/local/lib/python3.12/site-packages/celery/utils/dispatch/signal.py", line 276, in send
    response = receiver(signal=self, sender=sender, **named)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/fixups/django.py", line 97, in on_import_modules
    self.worker_fixup.validate_models()
  File "/usr/local/lib/python3.12/site-packages/celery/fixups/django.py", line 135, in validate_models
    self.django_setup()
  File "/usr/local/lib/python3.12/site-packages/celery/fixups/django.py", line 131, in django_setup
    django.setup()
  File "/usr/local/lib/python3.12/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python3.12/site-packages/django/apps/registry.py", line 124, in populate
    app_config.ready()
  File "/var/IBMS/NewServer/function/apps.py", line 22, in ready
    active_tasks = i.active()
                   ^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/app/control.py", line 149, in active
    return self._request('active', safe=safe)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/app/control.py", line 106, in _request
    return self._prepare(self.app.control.broadcast(
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/celery/app/control.py", line 776, in broadcast
    return self.mailbox(conn)._broadcast(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/kombu/pidbox.py", line 330, in _broadcast
    chan = channel or self.connection.default_channel
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/kombu/connection.py", line 953, in default_channel
    self._ensure_connection(**conn_opts)
  File "/usr/local/lib/python3.12/site-packages/kombu/connection.py", line 458, in _ensure_connection
    with ctx():
  File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__
    self.gen.throw(value)
  File "/usr/local/lib/python3.12/site-packages/kombu/connection.py", line 476, in _reraise_as_library_errors
    raise ConnectionError(str(exc)) from exc
kombu.exceptions.OperationalError: Error -3 connecting to redis:6379. Lookup timed out.

docker-compose配置

services:
  redis:
    image: redis:5
    command: redis-server /etc/redis/redis.conf
    volumes:
      - function_redis_vol:/data
      - ./compose/redis/redis.conf:/etc/redis/redis.conf
    ports:
      - "6379:6379"
    restart: always
  web:
    build: .
    command: ./start.sh
    expose:
      - "8000"
    volumes:
        ……
    links:
      - db
      - redis
    depends_on:
      - db
      - redis
    environment:
      - DEBUG=False
    restart: always
    tty: true
    stdin_open: true

start.sh脚本

python manage.py runserver 0.0.0.0:8000

celery -A ~ worker -l info -P eventlet -c 20

版本信息

  • docker-compose:1.29.2
  • python:3.12
  • django:4.1.6
  • celery:5.3.6
  • kombu:5.3.5
  • redis:5.0.3
  • dnspython:2.6.1
  • eventlet:0.34.1
  • greenlet:3.0.3

内容的提问来源于stack exchange,提问作者finn lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:40:24