2010-07-21 32 views
55

Làm cách nào tôi có thể nhận giá trị task_id cho tác vụ từ bên trong tác vụ? Dưới đây là mã của tôi:Cần tây - Nhận id tác vụ cho tác vụ hiện tại

from celery.decorators import task 
from django.core.cache import cache 

@task 
def do_job(path): 
    "Performs an operation on a file" 

    # ... Code to perform the operation ... 

    cache.set(current_task_id, operation_results) 

Ý tưởng là khi tôi tạo một đối tượng mới của nhiệm vụ, tôi lấy task_id từ đối tượng nhiệm vụ. Sau đó tôi sử dụng id tác vụ để xác định xem tác vụ đã hoàn thành chưa. Tôi không muốn theo dõi tác vụ theo giá trị path vì tệp được "dọn sạch" sau khi tác vụ hoàn tất và có thể tồn tại hoặc không tồn tại.

Trong ví dụ trên, làm cách nào để nhận được giá trị current_task_id?

Trả lời

7

Cần tây đặt một số đối số từ khóa mặc định nếu tác vụ chấp nhận chúng. (bạn có thể chấp nhận chúng bằng cách sử dụng một trong hai ** kwargs, hoặc liệt kê chúng đặc biệt)

@task 
def do_job(path, task_id=None): 
    cache.set(task_id, operation_results) 

Danh sách các đối số từ khóa mặc định là tài liệu ở đây: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

+28

Điều này không được chấp nhận như Celery 2.2.0 (xem câu trả lời bên dưới). – Simon

96

Kể từ cần tây 2.2.0, thông tin liên quan đến nhiệm vụ hiện đang được thực hiện được lưu vào task.request (nó được gọi là «ngữ cảnh»). Vì vậy, bạn sẽ nhận được nhiệm vụ id từ bối cảnh này (không phải từ đối số từ khóa, mà đang bị phản đối):

@task 
def do_job(path): 
    cache.set(do_job.request.id, operation_results) 

Danh sách của tất cả các trường có sẵn được ghi lại ở đây: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

+0

bạn có thể lấy id này bên ngoài tác vụ không? ví dụ như chạy nhiệm vụ, lấy id và kiểm tra với id này nếu nhiệm vụ được hoàn thành. – DominiCane

+0

Có, bạn có thể lấy id từ AsyncResult và sau đó tạo lại AsyncResult theo id, kiểm tra tài liệu http://docs.celeryproject.org/en/latest/reference/celery.result.html – HighCat

34

Tính đến cần tây 3.1, bạn có thể sử dụng đối số trang trí bind và có quyền truy cập vào yêu cầu hiện tại:

@task(bind=True) 
def do_job(self, path): 
    cache.set(self.request.id, operation_results) 
+0

Cảm ơn bạn đã phản hồi mới . Làm việc như một sự quyến rũ –

Các vấn đề liên quan