这是我在类中的 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 dict。
我需要在一个循环中检测这个字典的内容,但我被困在那里——服务器似乎被锁定在这个循环中,但我需要它来响应其他客户端(它们异步填充 self.client_data)
请您参考如下方法:
您绝对不想在使用 Twisted 的应用程序中编写这样的 while 循环。
理想情况下,您需要一个比 update_render 更好的 API - 一个返回 Deferred 的 API。 Deferred 为您提供了一个统一的、可组合的、方便的 API 来管理回调。回调对于使用 Twisted 进行编程非常重要。
update_render 应该在获取客户端数据后使用 Deferred 的 callback 方法 - 而不是将其放入 self。客户端数据。通过使用Deferred,它在Twisted的事件驱动系统中发挥得很好。您(调用者)附加到 Deferred 的回调可以将结果发送给客户端。
Twisted Web 有一个小怪癖,您需要从 render_GET 方法返回 twisted.web.server.NOT_DONE_YET 让服务器知道响应即将推出。
看看Twisted Web In 60 Seconds有关异步生成响应的一些示例。
