Python 正在等待另一个客户端
这是从资源继承的类中的render_GET函数。twisted HTTP服务器中的资源: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
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
,让服务器知道响应即将到来
请看一些异步生成响应的示例