7

私はdjango-celeryを読んで、celery_taskmetaをクリーンアップするネイティブな方法を見つけようとしているので、このテーブルは実稼働環境ではあまり大きくなりません。

何も見つかりません。これに対処するためのコマンドを実行する必要がありますか?

4

2 に答える 2

6

私はdjango-celeryを使用していないので、答えが不完全である可能性があります。

バックエンドには、celery_taskmetaのクリーンアップを強制できるメソッドがあります。celery.backends.base.BaseBackendには、メソッドcleanup()があります。

したがって、クリーンアップを強制する必要がある場合、3つの方法があります。

  1. プロデューサー側でAsyncResultを使用する
  2. 消費者側のタスクを使用する
  3. celerybeatタスク

プロデューサー側

# Launch a task
my_task = add_a_task() # use the Task.delay() method for example
# my_task is a celery.result.AsyncResult instance
# Retrieve backend and call cleanup
my_task.backend.cleanup()

消費者側

from celery import Task
from .celery_app import my_celery_app

# Class for a task
@my_celery_app.task()
class CopyTask(Task):
    # A Task instance got a backend property

    def run(self,**kwargs):
        """ Running method of the task """
        # Do something
        pass

    def force_cleanup(self):
        """ Force cleanup. """
       self.backend.cleanup()

タスク自体でクリーンアップを呼び出すことは、ひどく静かに見えることに注意してください。

celerybeatタスク付き

3番目のオプションは、バックエンドcelery_taskmetaをクリーンアップするcelerybeatタスクを使用することです。これはおそらく私が選ぶものです。

セロリビートは基本的にスケジューラーであり、あなたはあなたが望むタスクを実行することができます。したがって、次のような専用のタスクを実行できます。

from celery import Task
from .celery_app import my_celery_app

# Class for a task
@my_celery_app.task()
class CleanupTask(Task):
    # A Task instance got a backend property

    def run(self,**kwargs):
        """ Running method of the task """
        # Cleanup here
        self.backend.cleanup()

crontabジョブのようにセロリビートを設定することは十分に文書化されています

于 2013-03-20T07:36:43.613 に答える
3

このSQLステートメントを実行するDjangoコマンドを実行するcronジョブがあります。

"truncate table celery_taskmeta"

0.47msで50.000レコードを削除しました。

于 2013-09-30T20:39:27.980 に答える