Как отменить Twisted AMP Deferred?
У меня есть клиент-серверное приложение Twisted, в котором клиент запрашивает у нескольких серверов дополнительную работу с помощью AMP. Первый сервер, отвечающий клиенту, выигрывает - остальные невыполненные клиентские запросы должны быть отменены.
Deferred
поддержка объектов cancel()
и функция cancellor может быть передана Deferred
конструктор. Тем не менее, AMP sendRemote()
API не поддерживает передачу функции cancellor. Кроме того, я бы хотел, чтобы функция cancellor не только прекращала обработку локального запроса по завершении, но и удаляла запрос с удаленного сервера.
усилителя BoxDispatcher
есть stopReceivingBoxes
метод, но это приводит к тому, что все отсрочки выдают ошибку (не совсем то, что я хочу).
Есть ли способ отменить запросы AMP?
1 ответ
Нет. В настоящее время нет способа отменить запрос AMP.
Вы не можете отменить запросы AMP, потому что в уровне AMP на уровне проводного протокола не определен способ отправить сообщение на удаленный сервер с указанием прекратить обработку. Это было бы интересным дополнением для AMP, но если бы оно было добавлено, вы бы не добавили его, позволив пользователям передавать свои собственные средства подавления; скорее, сам AMP должен будет создать функцию отмены, которая отправит команду "отмена".
Наконец, добавление этой функции должно быть сделано очень аккуратно, поскольку после отправки запроса нет гарантии, что он не будет полностью обработан; шансы, как правило, хорошие, что к тому времени, когда запрос отмены получен и обработан удаленным концом, удаленный конец уже завершил обработку и отправил ответ. Таким образом, AMP должен реализовать асинхронную отмену.