2014-10-07 19 views
16

Ứng dụng của tôi tập hợp một loạt số điện thoại trên một trang. Sau khi người dùng nhấn nút gửi, tôi tạo một nhiệm vụ cần tây để gọi cho từng số và đưa ra một thông báo nhắc nhở rồi chuyển hướng họ đến trang nơi họ có thể xem các cập nhật trực tiếp về cuộc gọi. Tôi đang sử dụng ổ cắm web để cập nhật trạng thái của từng cuộc gọi và cần thực hiện các tác vụ đồng bộ vì tôi chỉ có quyền truy cập để quay số từ một số.Tạo nhiệm vụ cần tây rồi chạy đồng bộ

Vì vậy, khi cuộc gọi/nhiệm vụ đầu tiên được hoàn thành, tôi muốn cuộc gọi/nhiệm vụ tiếp theo được kích hoạt.

Tôi đã xem qua các cài đặt CELERY_ALWAYS_EAGER nhưng nó chỉ trải qua lần lặp đầu tiên và dừng lại.

@task 
def reminder(number): 
    # CODE THAT CALLS NUMBER HERE.... 

def make_calls(request): 
    for number in phone_numbers:      
     reminder.delay(number)  

    return redirect('live_call_updates') 
+0

bạn có một nhiệm vụ cần tây cho mỗi số điện thoại hay bạn đang sử dụng cần tây để khởi động các cuộc gọi một cách không đồng bộ một lần? – srj

Trả lời

4

nếu bạn muốn kích hoạt từng gọi cái khác, tại sao không bạn quấn tất cả các cuộc gọi trong một nhiệm vụ

@task 
def make_a_lot_of_calls(numbers): 
    for num in numbers: 
     # Assuming that reminder blocks till the call finishes 
     reminder(number) 

def make_calls(request): 
    make_a_lot_of_calls.delay(phone_numers)       
    return redirect('live_call_updates') 
+0

Để viết lại nhiệm vụ sử dụng cần tây có thể thích hợp vào những thời điểm, nhưng ở đây dường như việc thực hiện một cuộc gọi đơn lẻ là một định nghĩa thích hợp cho một tác vụ. – JivanAmara

16

Nếu bạn nhìn vào celery DOCS on tasks bạn thấy rằng để gọi một nhiệm vụ synchronosuly, bạn sử dụng phương thức apply() trái ngược với phương thức apply_async().

Vì vậy, trong trường hợp của bạn, bạn có thể sử dụng:

reminder.apply(args=[number]) 

Các DOCS cũng lưu ý rằng:
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.

Nhờ @JivanAmara người trong các ý kiến ​​nhắc lại rằng khi sử dụng áp dụng(), nhiệm vụ sẽ chạy cục bộ (trong máy chủ/máy tính mà nó được gọi). Và điều này có thể có phân nhánh, nếu bạn định chạy các tác vụ của mình trên nhiều máy chủ/máy.

+1

Hãy nhớ rằng chạy một nhiệm vụ bằng cách sử dụng apply() sẽ chạy đồng bộ, nhưng cũng sẽ chạy cục bộ. Đây là vấn đề nếu bạn dự định có nhiều máy đang xử lý. – JivanAmara

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