А за завтраком уже смотрел Серенаду. Вах, какое кино! Не в смысле киноискусства, это на уровне курочки рябы, а в смысле музыки и
танцев. Заканчивается все, правда, балетом на льду и катанием на лыжах. Голубой Огонек. Но ничо, ничо.
Полил помидоры. Вышел на газон, поменял valve (клапан) в поливалке, который не работал. Присоединил, все норм работает.
Открыл рабочий комп, что-то там потыкал пальцев, да закрыл. Вообще, сил нет, и спать хочется. Кошка пришла, так вместе сидели за компом.
Потом таки пошел перекрашивать стенку за нашим контрактором. Нет, сначала потолок подкрасил, где его краской от стены было замазано.
Поставил в качестве звука болтовню Теренса МакКенны. Нет, не смог. Я все пытался понять, он мудрец или тупой. Решил что таки тупой. Нафиг-нафиг, про всякие там "размерности" выслушивать. В школе бы, что ли, уже начали учить про размерности. Не знаю, ну. Это же, считай, dependency injection, если в программистских терминах.
Ну это ладно. Через силу покрасил стенку; таки хорошо же, все доделано, да? Убрал весь этот полиэтилен, повесил телевизор над камином.
Ха, добавил в слайды еще один слайд, "жалобы на Скалу", Ну типа отмазки, почему у меня в коде такая жопа.
На обед съел четверть кочана капусты, со сметаной, и тертую морковку, со сметаной. Да пофиг же, и вкусно.
Пошел искать этот whilst по интернетам. Нашел пример на гитхабе у Теппеи Сато, еще 2016-й год, на джаваскрипте. Теппеи потом скальщиком стал, выступал у нас. Окей, но там джаваскриптовый Promise. Стал изучать, напоролся на офигенный текст Доменика Дениколы про это все.
Решил разобраться, а как с Promises в скале. Стал читать про No Free Lunch и документацию по промисам и фьючерсам в скале. Потом на so стал читать про blocking. Да блин, я все неправильно делал! И коллеги мои тоже все неправильно распараллеливали. Бум чинить. Никогда не задумывался.
Короче, если у вас есть фьючерсы, до хрена, то стандартный executor их гоняет по стольку, сколько есть процессоров. Это, может быть, умно, если мы процессоры занимаем. Но если у нас там длинные операции, io всякое, то это фигня. Надо долгий код заворачивать в blocking, тогда экзекьютор запускает новые нитки. Вот дешевый пример:
object experiment {
import scala.concurrent._
val ec = scala.concurrent.ExecutionContext.Implicits.global
def main(args: Array[String]) {
val futures = (0 to 100) foreach { n =>
Future {
println("starting Future: " + n)
blocking {
println("in Future: " + n)
Thread.sleep(30)
println("out Future: " + n)
}
println("ending Future: " + n)
}(ec)
}
Thread.sleep(1000)
}
}
Здесь мы вообще не ждем завершения этих фьючерсов, но это неважно. Я нарочно поставил sleep в конце.
Короче, если blocking есть, то много ниток (все 100), а если нету, то всего шесть (на моем компе).
От така хуйня, малятки. Пошел дальше учиться программированию. Подруга скоро приедет.