2013-02-15 26 views
6

Có cách nào để tạm dừng/tiếp tục luồng công việc đang chạy được tạo bằng chuỗi từ cần tây 3.0 không?Chuỗi công việc cần thiết của Django Celery Tạm dừng/Tiếp tục

Về cơ bản, chúng tôi có hai loại tác vụ khác nhau trong hệ thống của chúng tôi: hệ thống tương tác và không tương tác. Những cái không tương tác chúng ta có tất cả các tham số, nhưng những cái tương tác cần đầu vào của người dùng. Lưu ý rằng đối với các tác vụ tương tác, chúng tôi chỉ có thể yêu cầu đầu vào của người dùng khi tất cả các taks trước đó trong chuỗi đã được hoàn thành, vì kết quả của chúng sẽ ảnh hưởng đến các tác vụ tương tác (nghĩa là chúng tôi không thể yêu cầu người dùng nhập trước khi tạo chuỗi thực tế).

Bất kỳ đề xuất nào về cách tiếp cận điều này? Thực sự thua lỗ ở đây ..

ý tưởng hiện tại:

  • Tạo hai lớp con của Task (từ cần tây nhập khẩu Task). Thêm một biến thể hiện (lớp thành viên) vào lớp con nhiệm vụ tương tác được đặt thành false theo mặc định và đại diện cho một số đầu vào người dùng vẫn cần thiết. Bằng cách nào đó có quyền truy cập vào cá thể Nhiệm vụ, và đặt nó thành sự thật từ bên ngoài công nhân cần tây (Mặc dù tôi đã xem xét điều này một chút và dường như không thể truy cập vào đối tượng Nhiệm vụ trực tiếp từ mô-đun khác)
  • Phân vùng chuỗi thành nhiều chuỗi được giới hạn bởi các công việc tương tác. Có một số loại cơ chế bên ngoài công nhân cần tây phát hiện một khi một chuỗi đã đạt đến nó kết thúc và kích hoạt thành phần phía khách hàng tương tác của nhiệm vụ tương tác. Khi người dùng đã nhập tất cả dữ liệu này, lấy dữ liệu và bắt đầu chuỗi mới, nơi nhiệm vụ tương tác nằm ở phần đầu của chuỗi mới.

Trả lời

2

Chúng tôi đã triển khai một cái gì đó giống như ý tưởng thứ hai của bạn trong dự án & nó hoạt động tốt. Đây là ý chính của việc thực hiện.

Thêm trường mới status vào mô hình & ghi đè phương thức lưu.

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

đèo status biến thành mẫu hữu ích để hiển thị phần tử giao diện người dùng cho người dùng nhập thông tin. Khi người dùng nhập thông tin bắt buộc, hãy thay đổi trạng thái. Điều này gọi số custom_func kích hoạt interactive_task của bạn.

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