2013-03-04 12 views

Trả lời

12

Tại sao không tạo mô hình nhiệm vụ cần tây và lưu id tác vụ cần tây cho mô hình đó?

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

Sau đó:

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

giá trị số nguyên của bạn sau đó sẽ là: celery_task.id để tương ứng với thực tế, celery_task_id độc đáo.

CẬP NHẬT: một cách khác ...

Đầu tiên python manage.py inspectdb > inspectdb.py. Bên trong tệp đó, bạn sẽ tìm thấy:

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' 

Tiếp theo, python manage.py startapp celery_model. Đặt tệp này trong tệp models.py. Tôi sử dụng phía nam, vì vậy bước cuối cùng của tôi sẽ là python manage.py convert_app celery_model. Tuy nhiên, nó không cần thiết. Bây giờ bạn có quyền truy cập cấp độ django để celery này datatable, và có thể đọc khóa chính cho mỗi nhiệm vụ như giá trị số nguyên của bạn. Ví dụ

>>> 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 

Có người thông minh sẽ biết làm thế nào để làm cho CeleryTaskmeta một mô hình chỉ đọc của bạn bởi vì tôi không nghĩ rằng bạn sẽ muốn làm xáo trộn các DataTable.

UPDATE: đến phần cuối của câu hỏi của bạn:

>>> 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> 
+0

Cảm ơn bạn đã giải thích kỹ lưỡng và rõ ràng! – pynovice

+1

Làm phiền vấn đề là tôi muốn truy xuất task_id khi quá trình bắt đầu. Nó chỉ ra dữ liệu được viết trong bảng CeleryTaskMeta chỉ sau khi công việc hoàn tất thành công. – pynovice

+0

@Cole làm thế nào để bạn lưu trữ kết quả từ một phế liệu không đồng bộ trong cơ sở dữ liệu? – losee

0

Để có được ID nhiệm vụ cần tây khi nhiệm vụ được bắt đầu tôi làm như sau:

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

nơi my_task là một phương pháp trong tasks.py