Я пытаюсь разобраться в конструкции blocking
. Хотя не совсем понятно, как это работает внутри, общая идея, которую я получил, заключалась в том, что, пока я использую глобальный пул потоков Scala, обертывание моего кода в контекст blocking
будет гарантировать, что пул потоков создаст для этого дополнительное пространство. задание (поскольку оно не связано с процессором).
(1 to 1000).foreach { i =>
Future {
println(i)
Thread.sleep(100 * 1000)
}
}
быстро покажет, что одновременно могут выполняться только 8 заданий, а
(1 to 1000).foreach { i =>
Future {
blocking {
println(i)
Thread.sleep(100 * 1000)
}
}
}
покажет, что сейчас у нас около 250 одновременных заданий. Вот Это Да!
Что меня тогда застало врасплох, так это то, что
(1 to 1000).foreach { i =>
Future {
println(i)
Thread.sleep(100 * 1000)
}
}
('a' to 'z').foreach { c =>
Future {
blocking {
println(c)
Thread.sleep(100 * 1000)
}
}
}
снова покажет только 8 одновременных заданий - блокирующие задания не будут выполнены сразу.
Почему это? Какова на самом деле внутренняя механика контекста blocking
?