Django rq 做批量数据库插入

标签 django asynchronous redis long-integer django-rq

如何入队一个会运行很长时间的函数?

我想做以下事情:

def batch_insert(数据): rows.append(MyModel(*data)) 如果 len(行) > 1000: MyModel.objects.bulk_create(行)

最佳答案

  1. 确保您在项目的 settings.py 中安装并注册了 django-rq 应用程序。您还需要以下设置集:

    RQ_QUEUES = {
        "default" : { "USE_REDIS_CACHE" : "jobs" },
    }
    

    并将以下内容添加到您的 CACHES 设置中:

    CACHES = {
        ...
        {
            "jobs": {
                "BACKEND"  : "django_redis.cache.RedisCache",
                "LOCATION" : "{{YOUR REDIS SERVER ADDRESS}}",
                "OPTIONS"  : {
                    "CLIENT_CLASS": "django_redis.client.DefaultClient",
                }
            }
        }
    }
    
  2. 在您的应用中创建一个 jobs.py 文件,其中包含您要排队的作业:

    from myapp.models import MyModel
    from django_rq    import job
    
    @job
    def batch_insert(data):
        rows = []
        rows.append(MyModel(*data))
        if len(rows) > 1000:
            MyModel.objects.bulk_create(rows)
        else:
            for row in rows:
                row.save()
    
  3. 将您的工作导入到触发它的 View 中

    from myapp.jobs import batch_insert
    
    trigger_batch_insert(request):
        sample_data = # Define your data here
        batch_insert.delay(sample_data) # This runs the job, instead of
                                        # running it synchronously
        return HttpResponse("Job running!")
    
  4. 确保将 View 连接到 urls.py
  5. 中的 URL 路由
  6. 确保您的 RQ worker 正在运行:

    $ python manage.py rqworker default
    
  7. 向 View 发送请求,并检查运行 RQ worker 的控制台以查看它是否有效:)

关于Django rq 做批量数据库插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930271/

相关文章:

javascript - 使用 ws 的 Django channel ://but fails to handshake with wss://

python - Django rest 框架在部署后为 post 方法返回 405

redis - 是否可以使redis中的每个值过期?

ios - viewDidLoad 中的标签没有更新?

azure - azure-mgmt-redis maven 依赖项使用什么?

unit-testing - 使用 redis mock 进行 Redis 单元测试

python - Django - 如何序列化继承

python - 如何跟踪线性工作流程中的步骤

java - Spring - @Async 在手动创建组件时不起作用

ios - 使用 SDWebImage block 的 ImageView 上的圆形进度条