1

如何将运行很长时间的函数排入队列?

我想做以下事情:

def batch_insert(data): rows.append(MyModel(*data)) if len(rows) > 1000: MyModel.objects.bulk_create(rows)

4

1 回答 1

0
  1. 确保您已django-rq在项目的settings.py. 您还需要以下设置集:

    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. 将您的作业导入到触发它的视图中

    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. 确保将视图连接到您的 URL 路由urls.py
  5. 确保您的 RQ 工作人员正在运行:

    $ python manage.py rqworker default
    
  6. 向视图发送请求,并检查运行 RQ 工作人员的控制台以查看它是否工作 :)

于 2016-09-12T01:11:36.327 回答