2016-12-29 13 views
1

Celery 4.0.2を使用してタスク間に大きなリソースファイルをキャッシュしようとしています。Celery Task instanciation cache

ドキュメンテーションで見ると、タスクのキャッシュ部分に手が届きます。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#instantiation

また、これは、例えば、データベース接続をキャッシュする基本Taskクラスキャッシュリソースに役立つことができます:私はキャッシュにいくつかの変更を行っている私の場合

from celery import Task 

class DatabaseTask(Task): 
    _db = None 

    @property 
    def db(self): 
     if self._db is None: 
      self._db = Database.connect() 
     return self._db 

私の大きなファイルリソースとそのオブジェクトはタスク間で共有されますが、大きなファイルリソースによって使用されるメモリは、永久にタスクにキャッシュされます。

from celery import Task 

class BigResourceTask(Task): 
    _resource = None 

    @property 
    def resource(self): 
     if self._resource is None: 
      self._resource = load_big_resource() 
     return self._resource 

どのように私はそのメモリを解放するか、それはすべての関連タスクの実行後に期限切れにすることができますか?

答えて

1

オンデマンドで_resourceを作成しているので、必要に応じて削除することができます。

# complete all the tasks 
del BigResourceTask._resource # free memory 

# do something else 

r = BigResourceTask.resource # create when needed 
+0

再生していただきありがとうございます。私はこれを試みましたが、これは各プロセスのための新しいリソースを作成しています。私は同じ基本タスクを持つすべてのプロセスのために何らかの種類の共有オブジェクトを用意しようとしていました。 – PaytoN