Вы красите комнату.У вас кончились краски, поэтому вы отправляете своего ребенка в магазин, чтобы купить больше краски, и ждете, пока они вернутся.Вы блокируете, когда краска становится доступной.Функция fetch_more_paint()
является «заданием» и блокируется, так как вы не можете больше ничего делать во время работы функции.Однажды начатый, он вступает во владение, пока это не заканчивается.
Вы красите комнату, планируете покрасить другую комнату в ближайшее время.У тебя кончилась краска.Вы говорите ребенку пойти в магазин, чтобы получить больше краски.Затем вы начинаете готовить следующую комнату для рисования, пока у вас нет краски.Когда ребенок возвращается с краской, вы возобновляете рисование первой комнаты.Вы не блокируете доступность краски: fetch_more_paint()
является запросом, а не работой: он не блокирует.После оформления запроса вы можете продолжать делать все, что вам нужно.
Есть два способа борьбы с ребенком, возвращающимся в неблокирующем сценарии.
Если вы хотите тратить наименьшее количество времени на переключение задач, вы закончите подготовительную работу, и только тогдапроверьте, доступно ли больше краски для возобновления покраски.В противном случае вы выбираете что-то еще, чтобы сделать.Это опрос между заданиями - вы проверяете завершенный статус неблокирующей функции, когда это удобно для вас.
Если вы хотите, чтобы рисование было выполнено как можно скорее, вы позволяете ребенку сообщить вам, как тольковозможно, когда краска доступна, и вы возобновите рисование прямо тогда.Это немного больше накладных расходов, так как вам нужно отбросить то, что вы делали в возможно неподходящий момент, выполняя немного больше работы, чтобы изменить задачу, над которой вы работаете.