2011-12-18 70 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

相关问题