Python 正在等待另一个客户端

Python 正在等待另一个客户端,python,twisted,Python,Twisted,这是从资源继承的类中的render_GET函数。twisted HTTP服务器中的资源: def render_GET(self, request): file = request.args['file'][0] altitude, azimuth, distance = request.args['position'][0].split(",") self.update_render(file, altitude, az

这是从资源继承的类中的render_GET函数。twisted 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"
发生的情况是,我需要twisted服务器等待函数
update\u render
执行某些操作(此函数是异步的,因此通过调用
self.update\u render()
我只是启动它,不确定实际数据是何时写入的。
update\u render()
的返回数据是在self.client\u data dict中写入的


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

你永远不想在扭曲的应用程序中编写这样的while循环

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

update\u render
在获取客户机数据后,应使用
Deferred
callback
方法,而不是将其放入
self.client\u数据中。通过使用
Deferred
,它可以在Twisted.A的事件驱动系统中很好地发挥作用。回调您(调用者)附加到延迟的
可以将结果发送到客户端

Twisted Web有一个小小的怪癖,您需要从
render\u GET
方法返回
Twisted.Web.server.NOT\u DONE\u
,让服务器知道响应即将到来

请看一些异步生成响应的示例