如何取消Twisted AMP Deferred?

时间:2015-07-08 22:16:00

标签: python twisted deferred asynchronous-messaging-protocol

我有一个Twisted客户端/服务器应用程序,客户端要求多台服务器使用AMP完成其他工作。第一台响应客户端的服务器获胜 - 其他未完成的客户端请求应该被取消。

Deferred个对象支持cancel(),并且可以将取消函数函数传递给Deferred的构造函数。但是,AMP的sendRemote() api并不支持传递一个终止函数。此外,我希望取消函数不仅可以在完成时停止本地请求的处理,还可以从远程服务器中删除请求。

AMP的BoxDispatcher确实有stopReceivingBoxes方法,但这会导致所有延迟错误输出(不是我想要的)。

有没有办法取消AMP请求?

1 个答案:

答案 0 :(得分:2)

没有。目前无法取消AMP请求。

您无法取消AMP请求,因为在线路协议级别的AMP中无法定义向远程服务器发送消息,告知其停止处理。对于AMP来说,这将是一个有趣的功能添加,但是如果要添加它,你就不会通过允许用户传入他们自己的消息来添加它;相反,AMP本身必须创建一个取消功能,发送"取消"命令。

最后,添加此功能必须非常小心,因为一旦发送请求,就不能保证它不会被完全处理;通常好的是,当远程端接收和处理取消请求时,远程端已经完成处理并发送了回复。所以AMP应该实现异步取消。