2011-12-18 71 views
4

短缺問題
使用下面我的例子,有沒有與該BaseRequestHandler同學分享my_object的實際實例的Python的方式嗎?BaseRequestHandler類有一種方法是有效的嗎?

背景
根據定義,BaseRequestHandler類創建用於每個請求的新實例。因此,我正在努力尋找解決方案,以便如何將數據從handle()函數返回到ProtocolInterface實例。請注意,如果我需要在handle()之外執行某些操作,而不是打印到標準輸出,則這可能是錯誤的方法。

在這個時間點,我不相信全局變量會工作,因爲my_object被通過,預計經常改變(這就是爲什麼handle()需要看到它。要查看示例客戶端(發送僞造的數據)看到我other SO question。我想我現在面臨的最大的問題是在socketservers在後臺線程中運行。

的,我想什麼爲例做

class ProtocolHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     while(1): 
      self.data = self.request.recv(1024) 
      if self.data == '': 
       break 
      self.request.send("Success") 
      self.my_object.success = True# <--- How can I share my_object's instance? 

class ProtocolInterface(): 
    def __init__(self, obj, host='127.0.0.1', port=8000, single_connection=False): 
     self.my_object = obj # <--- This ideally is the same instance seen in ProtocolHandler 
     self.host = host 
     self.port = port 

     # Create the socket server to process in coming traffic 
     if(single_connection): 
      self.server = SocketServer.TCPServer((self.host, self.port), ProtocolHandler) 
     else: 
      self.server = SocketServer.ThreadingTCPServer((self.host, self.port), ProtocolHandler) 

    def start(self): 
     print "Server Starting on HOST: " + self.host 
     server_thread = threading.Thread(target=self.server.serve_forever) 
     server_thread.daemon = True 
     server_thread.start() 
+0

'handle()'''while'循環中的代碼似乎有不正確的縮進? – 2011-12-18 01:29:02

+0

@Francis阿維拉。我猜它是爲你設置線包裹的。減去self.my_object這是一個有效的例子。 – 2011-12-18 01:41:31

回答

8

你可以通過傳遞對象服務器 例如:

self.server = SocketServer.TCPServer((self.host, self.port), ProtocolHandler) 
self.server.my_object = self.my_object 

documentation表明你可以在handle()訪問服務器實例作爲self.server

+1

希望我會看到。像冠軍一樣工作。謝謝! – 2011-12-18 03:35:27

+0

沒有線程同步,這有用嗎?多個線程正在寫入同一個變量。服務器對象應該如何使用或理解它? – 2011-12-19 20:15:54

+0

@FrancisAvila:您公開給基礎客戶端的對象必須是線程安全/實現鎖定。我上面的示例代碼只是使用bool寫得很差。帶有set/clear方法的線程事件將是一個更好的例子。 – 2014-06-25 13:58:20

相關問題