2011-12-29 23 views
7

Tôi cần xử lý một quy trình lớn (thời gian và bộ nhớ tiêu thụ) không đồng bộ trong ứng dụng web2py được gọi bên trong một phương thức điều khiển.Quá trình nền không đồng bộ với web2py

Trường hợp sử dụng cụ thể của tôi là gọi quá trình qua stdlib.subprocess và đợi nó thoát mà không chặn máy chủ web, nhưng tôi mở cho các phương thức thay thế.

  • Ví dụ thực hành sẽ là điểm cộng.
  • Đề xuất thư viện của bên thứ ba được hoan nghênh.
  • Lập lịch CRON không bắt buộc/muốn.

Trả lời

7

Giả sử bạn sẽ cần phải bắt đầu nhiều, có thể đồng thời, các phiên bản của tác vụ nền, giải pháp là hàng đợi công việc. Tôi đã nghe những điều tốt đẹp về Celery và RabbitMQ, nếu bạn đang tìm kiếm các tùy chọn của bên thứ ba và web2py bao gồm hệ thống it's own task queue có thể đủ cho nhu cầu của bạn.

Với một trong hai công cụ, bạn sẽ xác định một hàm đóng gói hoạt động mà bạn muốn quá trình nền thực hiện. Sau đó, đưa công nhân xếp hàng công việc trực tuyến. Hướng dẫn sử dụng web2py và diễn đàn cho biết điều này có thể được thực hiện bằng câu lệnh @reboot trong hệ thống cron web2py, được kích hoạt bất cứ khi nào máy chủ web khởi động. Có lẽ có nhiều cách khác để bắt đầu công nhân nếu điều này không đạt yêu cầu. Trong bộ điều khiển, bạn sẽ chèn một nhiệm vụ vào hàng đợi nhiệm vụ, truyền bất kỳ tham số cần thiết nào làm đầu vào cho hàm (chức năng nền sẽ không chạy trong cùng một môi trường như bộ điều khiển, vì vậy nó sẽ không có quyền truy cập vào phiên, DB, v.v. trừ khi bạn chuyển một cách rõ ràng các giá trị thích hợp vào hàm nhiệm vụ).

Bây giờ, để có được đầu ra của thao tác nền cho người dùng. Khi bạn chèn một nhiệm vụ vào hàng đợi nhiệm vụ, bạn sẽ lấy lại một ID duy nhất cho nhiệm vụ. Sau đó bạn sẽ thực hiện logic điều khiển (hoặc một cái gì đó dự kiến ​​một cuộc gọi AJAX, hoặc một trang tiếp tục làm mới cho đến khi tác vụ hoàn thành) gọi API của nhiệm vụ hàng đợi để kiểm tra trạng thái của tác vụ được chỉ định. Nếu trạng thái của tác vụ là "đã hoàn thành", hãy trả lại dữ liệu cho người dùng. Nếu không, hãy chờ đợi.

+0

Tôi nghĩ rằng trình lập lịch biểu tác vụ tích hợp chỉ là tôi đang tìm kiếm. –

1

Điều này khó hơn mong đợi. Lưu ý các cảnh báo bế tắc trong stdlib.subprocess documentation. Thật dễ dàng nếu bạn không ngại chặn --- sử dụng Popen.communicate. Để làm việc xung quanh việc chặn, bạn có thể quản lý quá trình bằng cách sử dụng stdlib.subprocess từ một luồng.

Cách yêu thích của tôi để xử lý các quy trình con là sử dụng Twisted's spawnProcess. Nhưng, nó không phải là dễ dàng để có được Twisted để chơi độc đáo với các khuôn khổ khác.

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