Celery |Flask错误:应为byteslike对象,但找到AsyncResult

2024-05-18 13:56:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个flask应用程序(python3.6),并希望集成celeri,因为我有多个长期运行的后台任务。在

编辑:芹菜4.1

集成没有问题,celery任务也正确执行,但我无法访问正在运行的任务的当前状态。在

芹菜、烧瓶设置:

def make_celery(app):
    celery = Celery(app.import_name,
                    backend=app.config["result_backend"],
                    broker=app.config["broker_url"])

    celery.conf.update(app.config)

    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True

        def __call__(self, *args, **kwargs):
            with app.app_context():
                return TaskBase.__call__(self, *args, **kwargs)

    celery.Task = ContextTask
    return celery


app = Flask(__name__)
app.config["broker_url"] = "redis://localhost:6379"
app.config["result_backend"] = "redis://localhost:6379"
app.config["DB"] = "../pyhodl.sqlite"

celery_app = make_celery(app)

芹菜任务:

^{pr2}$

调用任务并将值存储在字典中:

task_id = update_trading_pair.delay(exchange, currency_a, currency_b)
print("NEW TASK")
print(task_id)
id = exchange_mnemonic + "_" + currency_a + "_" + currency_b
TASK_STATES[id] = task_id

获取任务状态:

result = update_trading_pair.AsyncResult(TASK_STATES[market.__id__()])
print(result.state)
print(result) # works but only prints the task_id

这是因为出现了错误。当我只打印result对象时,它只打印任务的标识。如果我试图检索当前状态,则会引发以下异常:

TypeError: sequence item 1: expected a bytes-like object, AsyncResult found

Tags: idconfigbackendapptask状态updatebroker
1条回答
网友
1楼 · 发布于 2024-05-18 13:56:41

说明:

当您调用任务时:

task_id = update_trading_pair.delay(exchange, currency_a, currency_b)

您的变量task_idAsyncResult的实例,它不是字符串。在

因此,您的变量TASK_STATES[market.__id__()]也是AsyncResult的实例,而它应该是一个字符串。在

然后尝试用它实例化一个AsyncResult对象

^{pr2}$

因此,您使用另一个AsyncResult对象实例化一个AsyncResult对象,而它应该用字符串实例化。在

也许您的困惑来自于您的print(task_id),它向您显示了一个字符串,但是当您这样做时,AsyncResult对象的__str__方法被调用,如果您在源代码here中查看它

def __str__(self):
    """`str(self) -> self.id`."""
    return str(self.id)

它只是打印id对象的id属性。在

解决方案:

您可以通过执行TASK_STATES[id] = task_id.id

result = update_trading_pair.AsyncResult(str(TASK_STATES[market.__id__()]))

相关问题 更多 >

    热门问题