2016-08-13 19 views
1

長時間実行される関数をどのようにエンキューできますか?Django rq to batch db insert

私は次の操作を実行したい:

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

答えて

0
  1. あなたはdjango-rqアプリがインストールされ、プロジェクトのsettings.pyに登録されていることを確認します。仕事であなたがエンキューしたいのですが、

    CACHES = { 
        ... 
        { 
         "jobs": { 
          "BACKEND" : "django_redis.cache.RedisCache", 
          "LOCATION" : "{{YOUR REDIS SERVER ADDRESS}}", 
          "OPTIONS" : { 
           "CLIENT_CLASS": "django_redis.client.DefaultClient", 
          } 
         } 
        } 
    } 
    
  2. アプリでjobs.pyファイルを作成します。また、次の設定セットが必要になります。

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

    をし、あなたのCACHES設定に追加された次の:

    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. それ

    をトリガービューにあなたの仕事をインポートビューにリクエストを送信し、コンソールの実行を確認する

    $ python manage.py rqworker default 
    
  4. 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!") 
    
  5. はあなたのRQの労働者が実行されていることを確認してくださいあなたのurls.py
  6. にURLルートにビューをフックを確認してくださいそれが働いたかどうかを確認するRQ作業者:)