2012-07-23 107 views
2

这是我的类功能render_GET从resource.Resource在扭曲的HTTP服务器继承:扭曲等待另一个客户

def render_GET(self, request): 
      file = request.args['file'][0] 
      altitude, azimuth, distance = request.args['position'][0].split(",") 
      self.update_render(file, altitude, azimuth, distance, request.args['clientID'][0]) 
      # update_render() starts a thread that contacts this server again and POSTs data once done 
      self.add_client(request.args['clientID'][0]) 

      while not self.client_data[request.args['clientID'][0]]: 
       # I GET STUCK HERE - the thread CANT send data to this dict since server is locked in this loop 
       time.sleep(0.5) 

      return "DONE" 

什么情况是,我需要的扭曲的服务器要等到功能update_render做一些事情(这功能是异步的,所以通过调用self.update_render()我刚开始它,不知道什么时候被写入的实际数据。的update_render()返回数据被写入self.client_data字典。

我需要检测这个字典中的内容循环,但我卡在那里 - 它似乎服务器被锁定在这个循环但是我需要它来响应其他客户端(他们异步填充self.client_data)

回答

1

你永远不想写一个像Twisted使用应用程序那样的while循环。

理想情况下,您需要比update_render更好的API--返回Deferred的API。 Deferred为您提供了一个统一的,可组合的,方便管理回调的API。回调对于使用Twisted进行编程来说相当重要。

update_render一旦获得客户端数据,应该使用Deferred的方法 - 而不是将其放入self.client_data。通过使用Deferred,它在Twisted的事件驱动系统中可以很好地发挥作用。您(呼叫者)附加到Deferred的回叫可以将结果发送给客户端。

扭曲的网页有一个轻微的怪癖,你需要从render_GET方法返回twisted.web.server.NOT_DONE_YET让服务器知道响应即将到来。

查看Twisted Web In 60 Seconds了解异步生成响应的一些示例。

+0

谢谢 - 这就是我需要的 – kosta5 2012-07-24 07:40:28