2009-10-19 26 views
7

Tôi đang tìm cách ngăn nhiều máy chủ phát hành các lệnh đồng thời tới một trình nghe XMLRPC Python. Trình nghe có trách nhiệm chạy các tập lệnh để thực hiện các tác vụ trên hệ thống đó sẽ thất bại nếu nhiều người dùng cố gắng phát hành các lệnh này cùng một lúc. Có cách nào tôi có thể chặn tất cả các yêu cầu gửi đến cho đến khi cá thể đơn đã hoàn thành?Python XMLRPC với các yêu cầu đồng thời

+1

là khách hàng biết về ma trận xung đột? họ có đủ thông minh để lên lịch cho mình theo ma trận này không? làm thế nào để họ hoạt động được đồng bộ hóa vv ... – jldupont

+0

bạn đang sử dụng SimpleXMLRPCServer như tôi nghĩ rằng đây là đơn luồng ... – SeriousCallersOnly

+0

Tôi đang sử dụng SimpleXMLRPCServer, nhưng nó xuất hiện tôi có thể khởi động cùng một lệnh từ máy chủ khác nhau cùng một lúc, đó là những gì tôi cần phải ngăn chặn – MattB

Trả lời

15

Tôi nghĩ rằng mô-đun SimpleXMLRPCServer trăn là những gì bạn muốn. Tôi tin rằng hành vi mặc định của mô hình đó đang chặn các yêu cầu mới khi yêu cầu hiện tại đang được xử lý. Các hành vi mặc định đã cho tôi rất nhiều rắc rối và tôi thay đổi hành vi đó bằng cách trộn trong lớp ThreadingMixIn để máy chủ xmlrpc của tôi có thể đáp ứng nhiều yêu cầu trong cùng một thời gian.

class RPCThreading(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer): 
    pass 

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, SimpleXMLRPCServer là giải pháp. Chỉ cần sử dụng nó trực tiếp.

+0

+1, điều đó hoàn hảo! –

0

Bạn có thể có kênh truyền thông khác không? Nếu có, sau đó có một "gọi lại cho tôi khi nó là lần lượt của tôi" giao thức chạy giữa máy chủ và khách hàng.

Nói cách khác, mỗi khách hàng sẽ đăng ký ý định gửi yêu cầu tới máy chủ và máy chủ được nói sẽ "gọi lại" máy khách tiếp theo khi sẵn sàng.

+0

Tôi không nhất thiết phải quan tâm đến việc gọi lại khách hàng, moreso trong việc ngăn chặn các lệnh xung đột đang được nhiều máy chủ lưu trữ – MattB

+0

bạn có thể gửi lại mã HTTP 5xx (máy chủ bận hay bất kỳ thứ gì) không? – jldupont

+0

Điều gì định nghĩa "các lệnh xung đột"? – jldupont

0

Có một số lựa chọn:

  1. Sử dụng đơn quá trình đơn đề máy chủ như SimpleXMLRPCServer để xử lý các yêu cầu sau đó.
  2. Sử dụng threading.Lock() trong máy chủ được tạo luồng.
  3. Bạn một số cơ chế khóa bên ngoài (như lockfile mô-đun hoặc chức năng GET_LOCK() trong mysql) trong máy chủ đa xử lý.
Các vấn đề liên quan