2011-12-19 36 views
6

Tôi có hai máy chủ: một máy đang chạy ứng dụng django và một máy chạy cả hàng đợi thỏ và một công nhân cần tây. Tasks.py của tôi trên máy chủ đang chạy hàng đợi/công nhân có nhiệm vụ như sau:Chạy nhiệm vụ cần tây khi không thể nhập nhiệm vụ

@task(queue="reports") 
def test_task(): 
    time.sleep(120) 

Mục tiêu của tôi là thực hiện tác vụ này từ chế độ xem django. Kể từ khi mã cho nhiệm vụ là trên một máy chủ khác với xem django tôi muốn gọi nhiệm vụ, tôi đang cố gắng sử dụng mã sau đây để gửi nhiệm vụ từ django đến máy công nhân.

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue) 

Tôi đã tìm thấy phương pháp này here, nhưng cho đến nay thử nghiệm chưa hoạt động.

Tôi đang thử nghiệm với đuôi -F trên nhật ký công nhân cần tây trên máy chủ công nhân cần tây, sau đó điều hướng đến url của chế độ xem chứa send_task trong trình duyệt. Tôi đang tìm kiếm nhiệm vụ để hiển thị như là 'nhận' trong đầu ra đuôi, nhưng nó không.

Mức nhật ký của công nhân cần tây là DEBUG, tệp nhật ký cho thấy tác vụ được đăng ký với tên thích hợp và settings.py của ứng dụng django chứa IP và thông tin xác thực chính xác cho máy chủ thỏmq. Trong cố gắng tiếp cận khác nhau, tôi đã thỉnh thoảng nhìn thấy một thông báo lỗi trong nhật ký cần tây khi tôi thay đổi chuỗi thông qua để send_task đến một cái gì đó mà không phải là một nhiệm vụ hợp lệ (tức là send_task ('asdf')). Điều này gây ra một UnregisteredError trong logfile. Tuy nhiên, điều này chỉ xảy ra đôi khi, và cho đến nay trong thử nghiệm kết hợp khác nhau của các thiết lập và các cuộc gọi, tôi đã không tìm thấy một cách để sao chép đáng tin cậy hành vi.

Ngoài ra, đây là phần có liên quan của settings.py về dự án django (với giá trị thực tế loại bỏ):

CELERY_RESULT_BACKEND = 'amqp' 
BROKER_HOST = 'the.correct.IP.address' 
BROKER_USER = 'the_correct_user' 
BROKER_PASSWORD = 'the_correct_pass' 
BROKER_VHOST = 'the_correct_vhost' 
BROKER_PORT = 5672 

Tôi đã googled xung quanh và đã không tìm thấy nhiều vào send_task. Bất kỳ ý tưởng về những gì tôi có thể làm sai?

+0

Tôi muốn biết cách bạn chia sẻ mã của mình giữa hai máy. Đây là một câu hỏi tôi đã viết liên quan đến điều đó: http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server Cảm ơn! – lajarre

Trả lời

7

Đã giải quyết, hóa ra từ khóa nhà xuất bản arg i đã chuyển đến send_task không hợp lệ và ném lỗi. Không thấy lỗi vì tôi yêu cầu AJAX trang thay vì điều hướng trực tiếp. Mọi thứ khác về tình huống này là chính xác. Tôi cũng loại bỏ các từ khóa không cần thiết args và args được chuyển đến send_task.

send_task("tasks.test_task", task_id=task_id, queue=queue) 
2

Điều mà tôi nghĩ bạn đang cố gắng thực hiện là không thể. Người lao động cần có quyền truy cập vào mã nhiệm vụ mà họ đang chạy. Không có cách nào xung quanh đó.

SỬA ĐỔI:

Nhưng những gì bạn thực sự muốn làm là: có mã có sẵn cho người lao động nhưng không đến xem Django, mà nên tham khảo các nhiệm vụ chỉ theo tên.

+0

Bạn hoàn toàn đúng khi nhân viên cần tây yêu cầu mã họ sẽ chạy, nhưng tôi nghĩ bạn đã hiểu lầm một phần của bài đăng gốc. Để rõ ràng, người lao động có mã nhiệm vụ trên đó - đó là * gọi * của nhiệm vụ mà tôi muốn xảy ra từ xa. Vì vậy, xem django nói với nhân viên để chạy nhiệm vụ. –

+0

Đã sửa đổi sửa đổi! – dkamins

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