使用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
相关产品推荐
相关产品推荐

