Celery/Redis:redis.exceptions.ResponseError:'set'命令的参数数量错误

3

我在我的flask应用程序中尝试使用Celery进行异步调用。 为了使其运行,我已经完成了以下操作:

  1. 在我的pycharm环境中安装了celery。
  2. 安装了redis(从这里: https://github.com/dmajkic/redis/downloads)。
  3. 在我的main.py应用程序中实现了celery。
from flask import Flask
from celery import Celery

flask_app = Flask(__name__)
flask_app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
flask_app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'

celery = Celery(flask_app.name, broker=flask_app.config['CELERY_BROKER_URL'],
                backend=flask_app.config['CELERY_RESULT_BACKEND'])


@celery.task
def start_learn():
    a = 1+1
    return a


@flask_app.route("/ConLearn/XML/LearnRequest", methods=['POST'])
def learnRequest():
    task = start_learn.apply_async()
    return "", 201
  1. 使用64位的'redis-server.exe'运行redis redis runs
  1. 启动flask应用程序main.py
  2. 在终端中使用以下命令启动celery: celery -A main.celery worker

--> 出现故障:

2021-03-21 18:09:32.577271: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2021-03-21 18:09:32.587765: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.

 -------------- celery@md2cj75c v5.0.5 (singularity)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2021-03-21 18:09:43
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         main:0x213db0f9940
- ** ---------- .> transport:   redis://localhost:6379/0
- ** ---------- .> results:     redis://localhost:6379/0
- *** --- * --- .> concurrency: 4 (solo)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[2021-03-21 18:09:45,075: CRITICAL/MainProcess] Unrecoverable error: ResponseError("wrong number of arguments for 'set' command")
Traceback (most recent call last):
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\worker\worker.py", line 203, in start
    self.blueprint.start(self)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\bootsteps.py", line 116, in start
    step.start(parent)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\bootsteps.py", line 365, in start
    return self.obj.start()
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\worker\consumer\consumer.py", line 311, in start
    blueprint.start(self)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\bootsteps.py", line 116, in start
    step.start(parent)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\worker\consumer\mingle.py", line 37, in start
    self.sync(c)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\worker\consumer\mingle.py", line 41, in sync
    replies = self.send_hello(c)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\worker\consumer\mingle.py", line 54, in send_hello
    replies = inspect.hello(c.hostname, our_revoked._data) or {}
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\app\control.py", line 152, in hello
    return self._request('hello', from_node=from_node, revoked=revoked)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\app\control.py", line 94, in _request
    return self._prepare(self.app.control.broadcast(
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\celery\app\control.py", line 474, in broadcast
    return self.mailbox(conn)._broadcast(
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\pidbox.py", line 349, in _broadcast
    return self._collect(reply_ticket, limit=limit,
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\pidbox.py", line 391, in _collect
    self.connection.drain_events(timeout=timeout)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\connection.py", line 324, in drain_events
    return self.transport.drain_events(self.connection, **kwargs)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\transport\virtual\base.py", line 963, in drain_events
    get(self._deliver, timeout=timeout)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\transport\redis.py", line 381, in get
    self.maybe_restore_messages()
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\transport\redis.py", line 339, in maybe_restore_messages
    return channel.qos.restore_visible(
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\transport\redis.py", line 196, in restore_visible
    with Mutex(client, self.unacked_mutex_key,
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\kombu\transport\redis.py", line 117, in Mutex
    lock_acquired = lock.acquire(blocking=False)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\redis\lock.py", line 187, in acquire
    if self.do_acquire(token):
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\redis\lock.py", line 203, in do_acquire
    if self.redis.set(self.name, token, nx=True, px=timeout):
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\redis\client.py", line 1801, in set
    return self.execute_command('SET', *pieces)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\redis\client.py", line 901, in execute_command
    return self.parse_response(conn, command_name, **options)
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\redis\client.py", line 915, in parse_response
    response = connection.read_response()
  File "C:\Users\z002p84d\.conda\envs\ConLearn\lib\site-packages\redis\connection.py", line 756, in read_response
    raise response
redis.exceptions.ResponseError: wrong number of arguments for 'set' command

有人能帮我解决这个问题吗?我现在已经花费了数小时搜索互联网并尝试不同的设置。

谢谢,

马蒂亚斯

1个回答

4

看起来您正在使用旧版的Redis。您的链接包含自2011年(10年前)的Redis 2.4.5版本。

在Celery的源代码中,您可以看到以下要求:redis>=3.2.0。

您可以按照文档中的说明尝试通过pip进行安装:

pip install -U "celery[redis]"

非常感谢。通常情况下,答案很简单 :) - MUt
1
@ItayB 问题提出者没有足够的声望来点赞。你应该要求他们接受答案。 - Booboo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接