2016-08-13 68 views
1

如何排隊一個會運行很長時間的函數?Django rq做批量db插入

我要做到以下幾點:

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

回答

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工作人員看看它是否有效:)