Đa xử lý Python với Queue vs ZeroMQ IPC


10

Tôi đang bận viết một ứng dụng Python bằng ZeroMQ và thực hiện một biến thể của mẫu Majordomo như được mô tả trong ZGuide .

Tôi có một nhà môi giới như một trung gian giữa một nhóm công nhân và khách hàng. Tôi muốn thực hiện một số đăng nhập rộng rãi cho mọi yêu cầu đến, nhưng tôi không muốn nhà môi giới lãng phí thời gian để làm điều đó. Các nhà môi giới nên chuyển yêu cầu đăng nhập đó để một cái gì đó khác.

Tôi đã nghĩ về hai cách: -

  1. Tạo các công nhân chỉ để ghi nhật ký và sử dụng vận chuyển ZeroMQ IPC
  2. Sử dụng đa xử lý với hàng đợi

Tôi không chắc cái nào tốt hơn hay nhanh hơn cho vấn đề đó. Tùy chọn đầu tiên không cho phép tôi sử dụng các lớp cơ sở worker hiện tại mà tôi đã sử dụng cho các worker thông thường, nhưng tùy chọn thứ hai có vẻ nhanh hơn để thực hiện.

Tôi muốn một số lời khuyên hoặc ý kiến ​​về các giải pháp trên hoặc có thể là một giải pháp khác.

Câu trả lời:


4

Tôi thích cách tiếp cận sử dụng các công cụ tiêu chuẩn như những gì Jonathan đề xuất. Bạn đã không đề cập đến hệ điều hành nào bạn đang làm việc trên đó, nhưng một giải pháp thay thế khác có cùng tinh thần đó có thể là sử dụng mô đun ghi nhật ký tiêu chuẩn của Python cùng với logging.handlers.SysLogHandlervà gửi các thông điệp ghi nhật ký đến dịch vụ rsyslog (có sẵn trên bất kỳ linux / unix nào, nhưng tôi nghĩ rằng cũng có một tùy chọn cửa sổ , nhưng tôi chưa bao giờ sử dụng cái đó).

Về cơ bản, toàn bộ hệ thống thực hiện cùng một điều mà bạn đang nghĩ đến. Quá trình cục bộ của bạn xếp hàng tin nhắn nhật ký sẽ được xử lý / xử lý / viết bởi người khác. Trong trường hợp này, người khác ( rsyslog) là một dịch vụ nổi tiếng, đã được chứng minh có nhiều chức năng và tính linh hoạt tích hợp.

Một ưu điểm khác của phương pháp này là sản phẩm của bạn sẽ tích hợp tốt hơn nhiều với các công cụ sysadmin khác được xây dựng trên syslog. Và thậm chí sẽ không yêu cầu bạn viết bất kỳ mã nào để có tùy chọn đó.


1
+1 cho một đề xuất tránh phát minh lại bánh xe. Tôi sẽ không kế thừa một hệ thống được thiết kế theo cách này. Nó hoàn thành công việc một cách độc đáo, nhưng cung cấp nhiều mức độ tự do cho các sửa đổi trong tương lai.
evadeflow

2

Bạn có thể muốn xem xét khả năng thứ ba để thực hiện đăng nhập từ xa. Nếu bạn sử dụng mô đun ghi nhật ký Python tiêu chuẩn, bạn có thể xem xét sử dụng logging.QueueHandlerlớp trong công nhân, khách hàng và nhà môi giới của mình và logging.QueueListenerlớp trong quy trình ghi nhật ký từ xa của bạn.

Thay vì sử dụng Python bình thường multiprocessing.Queuelàm phương tiện vận chuyển giữa các quy trình ứng dụng và quy trình ghi nhật ký của bạn, hãy triển khai Queuelớp thay thế của riêng bạn bằng ZeroMQ bằng cách gõ vịt để lớp của bạn trở thành một thay thế thả xuống cho Python chuẩn Queue. Bằng cách này, ứng dụng của bạn sẽ có thể chạy không bị thay đổi trong bất kỳ môi trường nào từ một máy tính đa lõi thông qua các trung tâm dữ liệu phân tán.

Để tóm tắt, hãy sử dụng một trình ghi nhật ký Python tiêu chuẩn với QueueHandlertất cả nhân viên, khách hàng và nhà môi giới của bạn và tạo một quy trình độc lập dựa trên QueueListenerloggingtrình xử lý Python mà bạn chọn để xử lý việc ghi nhật ký nặng.


Tôi đang sử dụng Python 2.7. Tôi tin rằng lớp QueueHandler chỉ có sẵn từ Python 3.2.
Imraan

Sẽ rất dễ dàng để lấy mã từ Python 3 và sử dụng nó trực tiếp như một phần của ứng dụng của bạn.
Jonathan

Tôi sẽ thử điều đó và cho bạn biết nếu nó hoạt động
Imraan

0

Đây là những cách tiếp cận hoàn toàn khác nhau, mỗi cách đều có những ưu và nhược điểm riêng, rất có thể bạn sẽ thấy hoảng loạn ở giai đoạn phát triển sau:

Tôi đã nghĩ về hai cách: -

  1. Tạo các công nhân chỉ để ghi nhật ký và sử dụng vận chuyển ZeroMQ IPC
  2. Sử dụng đa xử lý với hàng đợi

Một cách bạn có thể thử là có thêm một nhân viên ghi nhật ký, như trong cách tiếp cận 1. Bạn có thể cho phép nhân viên của mình đăng nhập vào cụm ghi nhật ký memcache và nhân viên ghi nhật ký theo dõi tải tài nguyên hiện tại và sau khi xác định tham số tải tài nguyên đã cho, worker đăng nhập vào một thiết bị giới hạn IOP (ví dụ: ổ cứng).

Tôi cũng thích cách tiếp cận của Jonathan với lời cảnh báo rằng tôi cũng chủ yếu sử dụng Python 2.x và bạn có thể phải thiết lập phụ trợ ghi nhật ký của riêng mình để thực sự đẩy phong bì hiệu năng.

Sửa lỗi cho tôi nếu tôi sai, nhưng tôi nhận thấy rằng bạn đang thực hiện một số nhiệm vụ thực sự tốn nhiều dữ liệu, với IOP lưu trữ là nút cổ chai của bạn.

Một cách thuận tiện vẫn là cho phép người môi giới thực hiện việc brokerageghi nhật ký - theo mẫu như được mô tả - với tất cả các nhược điểm của một cá thể môi giới trung tâm. Ví dụ, nếu nhà môi giới có nhu cầu cao đến mức không bao giờ có phòng thở để ghi nhật ký memcached trở lại lưu trữ, bạn sẽ cần phải thực hiện một cách tiếp cận khác.

Cuối cùng bạn có thể kết thúc với một mô hình không môi giới. Đó là với các công nhân quản lý công việc của họ. Trong một ví dụ đơn giản, thông qua thuật toán phân phối vòng tròn phân tán .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.