Django 和 Celery 中的异步逻辑

Posted

技术标签:

【中文标题】Django 和 Celery 中的异步逻辑【英文标题】:Async logic in Django and Celery 【发布时间】:2013-12-21 05:19:07 【问题描述】:

从这个question出发,我有这个任务:

@task()
def create_user(data):
    try:
        User.objects.get(username=data['username'])
        return 'Username already exists'
    except:
        user = User.objects.create_user(username=data['username'], email=None, password=data['password']
)
        user.save()
        profile = UserProfile()
        profile.user = user
        profile.token = generate_token()
        profile.save()

        return profile.token

我理解 Celery 工作的方式是,假设有很多请求,这个任务可以放在队列中并在一段时间后执行。

让我们假设一个移动应用正在与这个服务器通信。用户将用户名和密码的组合发送到服务器进行注册。服务器只有在处理完任务后才会返回令牌。如果没有令牌,客户就无法登录。所以我必须等到任务处理完毕才能发送令牌。所以一切都变成了异步处理。那么Celery是如何解决这个问题的呢?

【问题讨论】:

【参考方案1】:

当用户不需要等待响应而不是简单的登录任务时,应将芹菜用于繁重的服务器端任务。

【讨论】:

【参考方案2】:

Celery 用于异步处理(嗯,主要是。)如果您正在执行您描述的操作,那么您必须先拥有令牌,然后用户才能继续。在这种情况下,您必须在启动任务后通过调用token = my_task.get() 之类的方法将对 celery 的调用视为阻塞调用。然后它是一个阻塞调用,这很糟糕(可能),但它被卸载到一个单独的进程,这可能是一件好事。

【讨论】:

以上是关于Django 和 Celery 中的异步逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Django中使用celery来异步处理和定时任务

Celery 分布式任务队列快速入门

异步任务队列Celery在Django中的使用

异步任务队列Celery在Django中的使用

celery在Django中的使用

Django使用Celery异步任务队列