【问题标题】:Should I be using Celery/Redis in my Django application?我应该在我的 Django 应用程序中使用 Celery/Redis 吗?
【发布时间】:2021-08-20 01:03:57
【问题描述】:

我有一个 Django 应用程序,旨在用作体育博彩或 DFS 网站的配套工具。我在很大程度上是自学成才的,所以我一直在采用更“随心所欲”的方法,然后在学习更好的方法来创建应用程序时回去修改我的方法。

我有几个 CSV 格式的数据表,我使用 shell 脚本将这些表导入到我的数据库中。例如,一张表用于首发阵容,另一张用于球员统计数据。然后,我在我的 models.py 中设置了方法来获取导入的数据并将其转换为我想要使用的数据。

我很快发现,尝试调用一大组对象以及它们的方法函数中的值根本没有效率。我通过这些方法获得了我需要的数据,因为其中很多都是基于来自多个表的数据(例如,我可能希望从球员对象的首发阵容表中获得比赛的开始时间。)

我目前的解决方案是使用线程每隔几分钟运行一个函数来计算播放器对象的每个方法的结果,然后将其作为字典列表存储在一个变量中,然后将该变量导入相关视图(而不是将变量设置为对象本身。)我敢肯定有一百万种方法这是一个坏主意。我还在学习。

我听说过一些关于 Celery 和 Redis 的事情,并认为这些可以用来做我正在做的事情(但当然是正确的方式。)我走在正确的轨道上吗?如果是这样,您是否发现任何资源对使用 Celery/Redis 有用?

感谢您抽出宝贵时间帮助我!

【问题讨论】:

    标签: python django web redis celery


    【解决方案1】:

    Redis 和 Celery 的优势在于它们允许在后台运行任务,同时让您的 Django 应用继续运行

    例如,假设我想创建 1000 个新的随机用户(坏主意,但这是概念)。如果我正常运行,我的应用程序必须等待函数结束才能执行以下行,这意味着用户必须等待

    但是用芹菜

    tasks.py

    @shared_task
    def create_random_user_accounts(total):
        for i in range(total):
            username = 'user_{}'.format(
                get_random_string(10, string.ascii_letters))
            email = "{}@example.com".format(username)
            password = get_random_string(50)
            User.objects.create_user(
                username=username, email=email, password=password)
        return "{} random users created with sucess!".format(total)
    

    randomview.py

    class GenerateRandomUserView(FormView):
        template_name = 'generate_random_users.html'
        form_class = GenerateRandomUserForm
    
        def form_valid(self, form):
            total = form.cleaned_data.get('total')
            create_random_user_accounts.delay(total)
            messages.success(
                self.request, "We are generating your users! Wait a moment and refresh")
            return redirect('users_list')
    

    在此示例中,我的用户将被重定向到用户列表,在每次刷新时,他们将能够看到正在创建的新用户,而无需等待所有用户都被创建

    TLDR: 在处理可能影响用户难处理性的计算繁重方法时,我建议使用 celery 和 redis

    不过,您确实需要另外两台服务器。一个运行 redis,另一个运行 celery,当然还有一个运行 Django 应用程序

    【讨论】:

    • 请注意,您可以在一台服务器上同时运行 redis、celery 和 django(gunicorn 或其他)。
    • 你有这个教程的链接吗?
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 2016-11-07
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2015-12-19
    相关资源
    最近更新 更多