2

这是我在类中的 render_GET 函数,它继承自扭曲 HTTP 服务器中的 resource.Resource:

    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 字典。

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

4

1 回答 1

1

你永远不想在使用 Twisted 的应用程序中编写这样的 while 循环。

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

update_render获取客户端数据后应使用Deferred'callback方法 - 而不是将其放入self.client_data. 通过使用Deferred,它在 Twisted 的事件驱动系统中运行良好。您(调用者)附加到的回调Deferred可以将结果发送给客户端。

Twisted Web 有一个小怪癖,您需要twisted.web.server.NOT_DONE_YET从该render_GET方法返回以让服务器知道响应即将到来。

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

于 2012-07-23T19:20:57.853 回答