Wpis z mikrobloga

Seniorzy w tym kraju produkują taki kod i nie widzą w tym nic złego ( ͡º ͜ʖ͡º) i jak w tym kraju ma być dobrze?

return periods.parallelStream()
.map(
period ->
transactionDAO
.findByUserIdAndPeriods(userIdAsUuid, period)
.collect(Collectors.toList()))
.flatMap(Collection::parallelStream)
.toList();

#programowanie #java #programista15k
  • 17
  • Odpowiedz
@whoru: a tak właściwie to co się stanie w tym kodzie? Ja nawet nie wiem czego tu się spodziewać jakich błędów. Ani nie jestem w stanie zrozumieć co autor tego kodu miał na myśli xD Nie znam dobrze parallel stream API ale zazwyczaj przetwarzanie równoległe opłaca się przy większej liczbie elementów

Jak np 100 periodów to co, pewnie weźmie ForkJoinPool z domyślną liczbą wątków procesora czyli wykona 100 calli do
  • Odpowiedz
  • 0
@nad__czlowiek: masz połączenie work-stealing threads z forkjoinpoola z blokującym wywołaniem io. W parallelStream należy wykonywać wyłącznie operacje, które wyjątkowo mocno korzystają z zasobów CPU i nie są blokujące (dostęp do plików, api call)
  • Odpowiedz
@whoru: nie kumam za bardzo co tu się stanie, pewnie poblokuje wątki, ale i tak sumarycznie zrobi to szybciej niż po kolei. Ja bym pobrał wszystko w jednym query
  • Odpowiedz
  • 0
@wafel93:

i tak sumarycznie zrobi to szybciej niż po kolei

tak, ale skoro robić to równolegle to można to zrobić poprawnie żeby faktycznie było równolegle

Ja bym pobrał wszystko w jednym query

no nie w przypadku cassandry akurat, ale to już szczegóły, o których nie wspomniałem, bo nie są istotne dla fakapu, który został popełniony w tym kodzie
  • Odpowiedz
Jak się to powinno dobrze zrobić w javie? Wystarczy użyć thread poola innego niż domyślny? Czy na jakichś future'ach? Co jeśli parallel stream używałby pod spodem virtual threadów zamiast normalnych? To też byłoby zbugowane?
  • Odpowiedz
@qbek135: też bym się dowiedział. Może kwestia użycia jakiegoś non blocking IO i reactive programming, ale osobiście nie mam w tym doświadczenia
  • Odpowiedz