应该如何取消 Twisted AMP Deferred?
How should a Twisted AMP Deferred be cancelled?
我有一个 Twisted client/server 应用程序,其中客户端请求多个服务器使用 AMP 完成额外的工作。第一个响应客户端的服务器获胜 -- 应取消其他未完成的客户端请求。
Deferred
对象支持 cancel()
并且可以将取消函数传递给 Deferred
的构造函数。但是,AMP 的 sendRemote()
api 不支持传递抵消函数。此外,我希望取消函数不仅在完成后停止处理本地请求,而且还从远程服务器删除请求。
AMP 的 BoxDispatcher
确实有一个 stopReceivingBoxes
方法,但这会导致所有延迟错误(不是我想要的)。
有没有办法取消 AMP 请求?
没有。目前无法取消 AMP 请求。
您无法取消 AMP 请求,因为 AMP 中没有在线路协议级别定义任何方式来向远程服务器发送消息以告知其停止处理。这将是 AMP 的一个有趣的功能添加,但如果要添加它,您不会通过允许用户传递他们自己的取消器来添加它;相反,AMP 本身必须创建一个发送 "cancel" 命令的取消函数。
最后,添加此功能必须非常小心,因为一旦发送请求,就无法保证它不会被完全处理;通常很有可能在远程端收到并处理取消请求时,远程端已经完成处理并发送了回复。所以AMP应该实现异步取消。
我有一个 Twisted client/server 应用程序,其中客户端请求多个服务器使用 AMP 完成额外的工作。第一个响应客户端的服务器获胜 -- 应取消其他未完成的客户端请求。
Deferred
对象支持 cancel()
并且可以将取消函数传递给 Deferred
的构造函数。但是,AMP 的 sendRemote()
api 不支持传递抵消函数。此外,我希望取消函数不仅在完成后停止处理本地请求,而且还从远程服务器删除请求。
AMP 的 BoxDispatcher
确实有一个 stopReceivingBoxes
方法,但这会导致所有延迟错误(不是我想要的)。
有没有办法取消 AMP 请求?
没有。目前无法取消 AMP 请求。
您无法取消 AMP 请求,因为 AMP 中没有在线路协议级别定义任何方式来向远程服务器发送消息以告知其停止处理。这将是 AMP 的一个有趣的功能添加,但如果要添加它,您不会通过允许用户传递他们自己的取消器来添加它;相反,AMP 本身必须创建一个发送 "cancel" 命令的取消函数。
最后,添加此功能必须非常小心,因为一旦发送请求,就无法保证它不会被完全处理;通常很有可能在远程端收到并处理取消请求时,远程端已经完成处理并发送了回复。所以AMP应该实现异步取消。