как понять отмены сопрограмм является кооперативным - PullRequest
0 голосов
/ 18 мая 2019

В котлин сопрограмма отмены кооперативов, как это понимать? ссылка на документацию Kotlin

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Я не уверен на 100%, понимаю ли я ваш вопрос, но, возможно, это поможет:

Сопрограммы обычно выполняются в том же потоке, с которого вы их начинаете.Вы можете использовать разные диспетчеры, но они предназначены для работы при запуске из одного потока.Никакого дополнительного планирования не происходит.Вы можете сравнить это с механизмами планирования в ОС.Сопрограммы ведут себя подобно кооперативному планированию.Вы найдете похожие концепции во многих средах и языках для работы с асинхронными операциями.Например, в Ruby есть волокна, которые ведут себя одинаково.

По сути, это означает, что если сопрограмма загружает ваш процессор в занятом цикле, вы не можете отменить его (если не уничтожите весь процесс).Вместо этого ваши сопрограммы должны регулярно проверять отмену, а также добавлять ожидания / задержки / выходы, чтобы другие сопрограммы могли работать.

Это также определяет, когда сопрограммы наиболее полезны: при работе в однопоточномконтекст, это не помогает использовать сопрограммы для локальных расчетов.Я использовал их в основном для обработки асинхронных вызовов, таких как взаимодействие с базами данных или веб-серверами.

В этой статье также есть некоторые пояснения о том, как работают сопрограммы - возможно, это поможет вам с любыми дополнительными вопросами: https://antonioleiva.com/coroutines/

0 голосов
/ 19 мая 2019

Если у вас есть фон Java, вы можете быть знакомы с механизмом прерывания потока. Любой поток может вызвать thread.interrupt(), и принимающий поток получит сигнал в виде флага boolean isInterrupted, который станет истинным. Принимающий поток может в любое время проверить флаг с помощью currentThread.isInterrupted() & mdash; или он может полностью игнорировать это. Вот почему этот механизм называется кооперативным.

Механизм отмены сопрограмм Котлина является точной копией этого: у вас есть флаг coroutineContext.isActive, который вы (или вызываемая вами функция) можете проверить.

В обоих случаях некоторые известные функции, например Thread.sleep() в Java и delay() в Kotlin, проверяют этот флаг и выдают InterruptedException и CancellationException соответственно. Эти методы / функции называются «прерываемыми» / «отменяемыми».

...