2011-08-19 9 views
6

Tôi đang sử dụng Perspective Broker của xoắn để nói chuyện giữa khách hàng và máy chủ. Các yêu cầu của khách hàng từ máy chủ một phương pháp từ xa 'remote_ssh'. Điều này khiến máy chủ PB khởi tạo kết nối SSH bằng thư viện SSH của Paramiko và truy xuất cấu hình từ thiết bị từ xa.quan điểm xoắn môi giới phía máy chủ chậm trễ

Tất cả đều hoạt động tốt, nhưng khi tôi thực hiện điều này cho một số thiết bị từ xa, tôi thấy hành vi sau đây - ứng dụng Perspective Broker sẽ gửi tất cả yêu cầu tới máy chủ PB. Sau đó, máy chủ PB sẽ thực hiện các yêu cầu này một lần (điều này là tốt), nhưng nó sẽ không trả về bất kỳ kết quả nào cho đến khi chúng hoàn tất.

Đây là mã máy chủ PB bên liên quan:

class RMethods(pb.Root): 

    def remote_ssh(self, aDict): 

     self.login('SSH', aDict)  # Login to remote device 
     response = self.aSSH.retrieve() # Retrieve the config 
     self.aSSH.close() 

     return response 


if __name__ == "__main__": 
    reactor.listenTCP(1885, pb.PBServerFactory(RMethods())) 
    reactor.run() 

Từ nhìn vào thông tin cấp hệ thống khác nhau (tcpdump và netstat), tôi thấy như sau (giả 5 cuộc gọi của phương thức từ xa):

Gọi remote_ssh từ PB Client để PB server cho năm thiết bị từ xa sẽ xảy ra vào khoảng cùng thời gian

self.login device 1 
    self.aSSH.retrieve() device 1 
    self.aSSH.close() device 1 

    self.login device 2 
    self.aSSH.retrieve() device 2 
    self.aSSH.close() device 2 

    ... 

    self.login device 5 
    self.aSSH.retrieve() device 5 
    self.aSSH.close() device 5 

    return results for all 5 devices 

tôi không hiểu tại sao nó chờ đợi để trả lại r esults (tức là tại sao nó đợi cho đến khi thiết bị5 hoàn thành trước khi kết quả cho thiết bị1 được trả về).

Trả lời

5

Điều này xảy ra vì không thể gửi phản hồi cho đến khi lò phản ứng có cơ hội chạy. Nếu cả năm yêu cầu đến cùng khoảng thời gian, thì lò phản ứng có thể thức dậy một lần và nhận thấy tất cả năm yêu cầu cùng một lúc. Nó sẽ gửi tất cả năm người trong số họ đến máy chủ PB. Phương pháp remote_ssh sẽ phục vụ một trong số chúng, chặn toàn bộ thời gian. Khi nó được thực hiện, phản ứng sẽ (gần như chắc chắn) được xếp hàng đợi. Sau đó, phương thức remote_ssh sẽ phục vụ phương thức tiếp theo và phản hồi đó sẽ được xếp hàng đợi. Và như vậy cho đến khi tất cả các yêu cầu đã được xử lý. Sau đó lò phản ứng sẽ hoàn thành việc gửi đi nhóm 5 sự kiện ban đầu và chuyển sang điều tiếp theo. Khi nó di chuyển trên, nó sẽ tìm thấy dữ liệu sẵn sàng để được gửi và bắt đầu gửi nó.

Nói cách khác, ngăn chặn ngăn lò phản ứng hoạt động, bao gồm ngăn không cho nó gửi đầu ra đã sẵn sàng để gửi đi.

Thay vào đó, bạn có thể thử Twisted Conch làm ứng dụng SSH, có thể cho phép bạn thực hiện công việc SSH mà không bị chặn hoặc bạn có thể thử sử dụng mã SSH hiện tại của mình với chủ đề (giả sử nó có thể được tạo luồng an toàn) hoặc nhiều quy trình .

+0

Tôi sẽ bình luận bạn có thể đưa ra một ví dụ về cách sử dụng Conch khi tôi nhớ bạn đã viết: http://as.ynchrono.us/2011/03/twisted-conch-in-60-seconds.html – stderr

+0

Ngay cả với chủ đề, tôi không thấy làm thế nào tôi có thể làm điều này (tôi đã cố gắng). Vấn đề cơ bản mà tôi gặp phải là tôi phải chặn để chờ kết quả SSH quay trở lại, nhưng một khi tôi chặn trên Perspective Broker remote_method chính, thì nó chặn tất cả việc thực thi các kết nối SSH khác bằng remote_method. –

+0

Tại sao bạn phải chặn để chờ kết quả SSH quay lại? Tránh chặn bằng cách thực hiện công việc trong một luồng hoặc quy trình riêng biệt hoặc tránh chặn bằng cách sử dụng API khách hàng Conch không chặn. –