Skip to main content
 首页 » 编程设计

python之扭曲等待另一个客户

2025年05月04日7powertoolsteam

这是我在类中的 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有关异步生成响应的一些示例。