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ề).
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
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. –
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. –