8

でセロリを使用していMySQLます。タスク ID を単純な整数としてデータベースまたは celery の変数に保存したいと考えていますtask。どうやってやるの?

4

2 に答える 2

14

セロリ タスク モデルを作成し、セロリ タスク ID をそのモデルに保存してみませんか?

class CeleryModel(models.Model):
    celery_task_id = models.CharField(max_length = 50, unique=True)

それで:

def some_celery_task():
    result = celery_task.delay()
    celery_task = CeleryModel(celery_task_id = result.id)
    celery_task.save() # added save line

整数値は次のようになりますcelery_task.id。実際の一意の celery_task_id に対応します。

更新:別の方法...

まずpython manage.py inspectdb > inspectdb.py。そのファイルの中には、次のものがあります。

class CeleryTaskmeta(models.Model):
    id = models.IntegerField(primary_key=True)
    task_id = models.CharField(max_length=765, unique=True)
    status = models.CharField(max_length=150)
    result = models.TextField(blank=True)
    date_done = models.DateTimeField()
    traceback = models.TextField(blank=True)
    hidden = models.IntegerField()
    meta = models.TextField(blank=True)
    class Meta:
        db_table = u'celery_taskmeta'

次に、python manage.py startapp celery_model. このファイルを models.py ファイルに入れます。私は南を使用するので、最後のステップはpython manage.py convert_app celery_model. ただし、不要です。これで、このセロリ データテーブルに django レベルでアクセスできるようになり、各タスクの主キーを整数値として読み取ることができます。例えば

>>> ct = CeleryTaskmeta.objects.get(id=1)
>>> for k,v in ct.__dict__.items(): print k,v
... 
status SUCCESS
task_id 2fa95f24-7640-434c-9fef-0732ac1d23c7
date_done 2013-02-17 19:22:56+00:00
traceback None
_state <django.db.models.base.ModelState object at 0x10263fa90>
meta eJxrYKotZAzlSM7IzEkpSs0rZIotZC7WAwBREgb9
result gAJLBC4=
hidden 0
id 1

CeleryTaskmetaデータテーブルを改ざんしたくないと思うので、賢い人なら読み取り専用モデルにする方法を知っているでしょう。

更新:質問の最後の部分に:

>>> from celerytest.tasks import add
>>> result = add.delay()
>>> result.int_id = 1
>>> for k,v in result.__dict__.items(): print k,v
...
parent None
app <Celery default:0x10264df10>
task_name celerytest.tasks.add
int_id 1
id 01503afd-d196-47af-8e10-e7dc06603cfc
backend <djcelery.backends.database.DatabaseBackend object at 0x1026842d0>
于 2013-03-04T12:59:04.420 に答える
1

タスクの開始時にセロリのタスク ID を取得するには、次のようにします。

process_task = my_task.apply_async(args=[args])
task_id = process_task.task_id

my_task は、tasks.py 内のメソッドです。

于 2013-11-26T10:40:53.110 に答える