2013-04-18 42 views
5

tôi có thể tạo kết nối của tôi đến một máy chủ như thế này:Làm thế nào để kiểm tra xem một ví dụ twisted.internet.protocol đã bị ngắt kết nối

connection = TCP4ClientEndPoint(reactor, server_host, server_port) 
factory = Factory() 
factory.protocol = Protocol 
protocol = yield connection.connect(factory) 
protocol.doSomething()  # returns a deferred 

Bây giờ, trong một số phương pháp khác, nơi tôi có một xử lý về đối tượng giao thức này Tôi muốn kiểm tra xem giao thức vẫn được kết nối hay không, như sau:

if protocol.isConnected(): 
    doSomethingElse() 

Có cách nào để thực hiện việc này không. Tôi nhìn vào tài liệu xoắn và không thể tìm thấy một phương pháp có liên quan. Đặt cờ trong callLost() gọi lại là một tùy chọn, nhưng tôi đã tự hỏi nếu tôi có thể tránh làm điều đó.

Trả lời

6

Cố gắng xoắn càng nhẹ càng tốt khi nói đến trạng thái lưu trữ. Cũng giống như các nhà máy trần hoàn toàn không theo dõi con cái của họ, Protocols biết rất ít về bản thân họ. Họ chủ yếu là túi gọi lại.

Đặt cờ theo phương pháp connectionLost() là cách thực hiện. Để tham khảo trong tương lai:

from twisted.internet.protocol import Protocol 

class StatefulProtocol(Protocol): 
    def __init__(self, factory): 
     self.connected = False 

    def connectionMade(self): 
     self.connected = True 

    def connectionLost(self, reason): 
     self.connected = False 

Sửa: lưu ý rằng có một lý do này cảm thấy không thoải mái. Nếu bạn có một phương thức cần đặt câu hỏi này, có thể bạn đang làm việc bên ngoài chuỗi gọi lại. Nếu bạn đang chạy mã độc quyền trong các phương pháp vòng đời được hiển thị bởi Protocol, bạn có thể không cần mã này.

+0

cảm ơn! Tôi không phải rất quen thuộc với các thực hành thiết kế với xoắn. Bằng phương pháp vòng đời, bạn có nghĩa là tôi nên làm tất cả công việc của mình trong hàm callMade(), và không cần phải gọi một cách rõ ràng cái gì đó giống như protocol.doSomething()? – AnkurVj

+1

Có. Bằng cách chạy tất cả các hành vi cần thiết từ các phương thức gọi lại, bạn tránh sự cần thiết của trạng thái theo dõi (thường dễ bị lỗi) bởi vì bạn chỉ cần thực hiện các công việc khi nó cần được thực hiện. Lưu ý rằng điều này là ** mong muốn **, nhưng không phải luôn luôn ** có thể **. Một số thiết kế chỉ cần cờ như trên. Cố gắng tránh nó, nhưng đừng làm hỏng codebase của bạn trong một nỗ lực để thực hiện theo thực hành tốt nhất :) – slezica

+0

Thật vậy. Tôi đã tìm thấy nó rất khó khăn để làm điều đó tất cả trong callbacks! Ví dụ tôi đã phải cung cấp cho các đối tượng giao thức một số biến bổ sung sau khi kết nối và trước khi nó đã làm bất cứ điều gì, nhưng không biết làm thế nào để làm điều đó! Tôi đã phải thực hiện 'protocol.val = val' và sau đó gọi' protocol.doSomething() 'thay vì thực hiện' self.doSomething() 'trong' connectionMade() 'callback – AnkurVj

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