Làm thế nào để bạn theo dõi các nhiệm vụ cần tây?

Điều hướng đến http. //127. 0. 0. 1. 8000/ trong trình duyệt web của bạn và thưởng thức 40 hình ảnh độc đáo từ Ảnh thiên văn trong ngày của Nasa. Để tham khảo, đây là bản ghi màn hình của ứng dụng web đang hoạt động và nếu ứng dụng web của bạn không hoạt động như mong đợi, tất nhiên bạn có thể sao chép một phiên bản đang hoạt động từ GitHub

Một nhiệm vụ là một lớp có thể được tạo ra từ bất kỳ chức năng nào có thể gọi được. Nó thực hiện hai vai trò ở chỗ nó xác định cả những gì xảy ra khi một tác vụ được gọi [gửi một tin nhắn] và điều gì xảy ra khi một worker nhận được tin nhắn đó

Mỗi lớp nhiệm vụ có một tên duy nhất và tên này được tham chiếu trong các thông báo để nhân viên có thể tìm đúng chức năng để thực thi

Thông báo nhiệm vụ không biến mất cho đến khi thông báo đó là của một nhân viên. Một nhân viên có thể đặt trước nhiều tin nhắn và ngay cả khi nhân viên đó bị giết – do mất điện hoặc lý do khác – tin nhắn sẽ được gửi cho một nhân viên khác

Các hàm tác vụ lý tưởng nhất nên là , có nghĩa là hàm đó sẽ không gây ra các hiệu ứng ngoài ý muốn ngay cả khi được gọi nhiều lần với cùng một đối số. Vì nhân viên không thể phát hiện xem các tác vụ của bạn có bình thường hay không, nên hành vi mặc định là xác nhận trước thông báo, trước khi nó được thực thi, để một tác vụ đã được bắt đầu sẽ không bao giờ được thực thi lại

Nếu nhiệm vụ của bạn là idempotent, bạn có thể đặt tùy chọn acks_late để nhân viên xác nhận thông báo sau khi nhiệm vụ đó quay trở lại. Xem thêm mục Câu hỏi thường gặp.

Trong chương này, bạn sẽ tìm hiểu tất cả về cách xác định nhiệm vụ và đây là mục lục

Bạn có thể dễ dàng tạo một nhiệm vụ từ bất kỳ cuộc gọi nào bằng cách sử dụng trình trang trí

from .models import User

@app.task
def create_user[username, password]:
    User.objects.create[username=username, password=password]

Ngoài ra còn có nhiều thứ có thể được đặt cho tác vụ, chúng có thể được chỉ định làm đối số cho trình trang trí

@app.task[serializer='json']
def create_user[username, password]:
    User.objects.create[username=username, password=password]

Làm cách nào để nhập trình trang trí tác vụ?

Trình trang trí tác vụ có sẵn trên phiên bản ứng dụng của bạn, nếu bạn không biết đó là gì thì vui lòng đọc

Nếu bạn đang sử dụng Django hoặc vẫn đang sử dụng API cần tây dựa trên mô-đun “cũ”, thì bạn có thể nhập trình trang trí tác vụ như thế này

from celery import task

@task
def add[x, y]:
    return x + y

Nhiều trang trí

Khi sử dụng nhiều trình trang trí kết hợp với trình trang trí tác vụ, bạn phải đảm bảo rằng trình trang trí tác vụ được áp dụng cuối cùng [điều kỳ lạ trong Python có nghĩa là nó phải là trình đầu tiên trong danh sách]

@app.task
@decorator2
@decorator1
def add[x, y]:
    return x + y

Mỗi tác vụ phải có một tên duy nhất và một tên mới sẽ được tạo từ tên hàm nếu tên tùy chỉnh không được cung cấp

Ví dụ

>>> @app.task[name='sum-of-two-numbers']
>>> def add[x, y]:
..     return x + y

>>> add.name
'sum-of-two-numbers'

Cách tốt nhất là sử dụng tên mô-đun làm không gian tên, theo cách này, tên sẽ không xung đột nếu đã có tác vụ với tên đó được xác định trong mô-đun khác

>>> @app.task[name='tasks.add']
>>> def add[x, y]:
..     return x + y

Bạn có thể biết tên của nhiệm vụ bằng cách điều tra thuộc tính tên của nó

>>> add.name
'tasks.add'

Dù sao thì đó chính xác là tên sẽ được tạo, nếu tên mô-đun là “tác vụ. py”

nhiệm vụ. p .

@app.task
def add[x, y]:
    return x + y

>>> from tasks import add
>>> add.name
'tasks.add'

Đặt tên tự động và nhập tương đối

Nhập tương đối và tạo tên tự động không kết hợp tốt với nhau, vì vậy nếu bạn đang sử dụng nhập tương đối, bạn nên đặt tên rõ ràng

Ví dụ: nếu khách hàng nhập mô-đun “myapp. nhiệm vụ” như”. task” và worker nhập mô-đun dưới dạng “myapp. task”, các tên được tạo sẽ không khớp và nhân viên sẽ báo lỗi

Đây cũng là trường hợp khi sử dụng Django và sử dụng dự án. cách đặt tên theo kiểu myapp trong INSTALLED_APPS .

________số 8

Nếu bạn cài đặt ứng dụng có tên project. myapp thì mô-đun tác vụ sẽ được nhập dưới dạng project. ứng dụng của tôi. nhiệm vụ , vì vậy bạn phải đảm bảo rằng bạn luôn nhập các nhiệm vụ có cùng tên.

>>> from project.myapp.tasks import mytask   # >> from myapp.tasks import mytask    # 

Chủ Đề