Причина, по которой вы не можете напрямую сохранить / прервать обещание извне или остановить его в пуле потоков, объясняется здесь в комментарии Джонатанса.
Обычное неправильное использование обещаний происходит из-за тайм-аута.
await Promise.anyof(
start { sleep 4; say "finished"; },
Promise.in( 1 )
);
say "moving on...";
sleep;
Эта будет печать завершена. И когда пользователь понимает, что следующий логический шаг для него - попытаться убить устаревший Promise. Хотя единственный правильный способ решить эту проблему - сообщить Promise, что его работа больше не нужна. Например, периодически проверяя некоторую общую переменную.
Все усложняется, если у вас есть код блокировки в Promise (например, запрос к базе данных), который выполняется слишком долго, и вы хотите завершить его из основного потока. На обещаниях это невозможно. Все, что вы можете сделать, это обеспечить выполнение Promise за конечное время (например, в MySQL, установив MAX_EXECUTION_TIME перед выполнением запроса). И тогда у вас есть выбор:
- Вы можете скрипеть зубами и терпеливо ждать, пока Promise закончит. Например, если вам действительно нужно отключить базу данных в основном потоке.
- Или вы можете сразу же перейти к следующему шагу и позволить заброшенному обещанию закончиться самостоятельно, так и не получив его результата. В этом случае вы должны контролировать, сколько из этих обещаний может складываться в фоновом режиме, используя семафор или выполняя их на выделенном ThreadPoolScheduler.
person
Pawel Pabian bbkr
schedule
09.10.2020