Fork me on GitHub
#clojure-norway
<
2024-07-06
>
teodorlu16:07:27

Hvordan får du en Clojure-funksjon til å gå fortere med parallelisering? For https://clojurians.slack.com/archives/C061XGG1W/p1707477511195369 spurte @teodorlu om råd, og fikk innspill fra @augustl, @msolli, @leif.eric.fredheim og @terjesb. Terje skrev til og med ut flere fulle løsninger på problemet uten bruk av annet enn JVM-en. Det viser seg at det finnes flere gode løsninger for å få Clojure-funksjoner til å gå fortere, men det kommer litt an på hva slags jobb du gjør i funksjonene dine. Er det begrenset av CPU? Må du vente mye på andre systemer? Les for å finne ut! Gi gjerne et pip om hva du synes—både om teksten, metoden og core.async. Det er tross alt mulig å løse dette med ren JVM, som Terje har vist tidligere. https://play.teod.eu/clojure-easy-parallellism-with-pipeline-blocking/ Hilsen @r.sevaldson og Teodor

👀 1
👏 3
🚀 1
Ivar Refsdal12:07:21

Eg dristar meg til å koma med eit innspel: Er det verdt å nemna virtual threads som kom i java 21? Det fjernar mykje av value proposition for core.async på JVM-en? Det er vel uansett berre interessant om ein skal gå "web scale".. (så kva ville eg eigentleg fram til?) Eg har ikkje sett på det sjølv, men core async har også OOM issues, f.eks. https://clojure.atlassian.net/browse/ASYNC-247 mogleg det er fleire/andre. @isak har nemnt det før. Min "takeaway" er at eg ville vore skeptisk til bruk av core.async, iallefall async (!) delen, dvs. det som omskriver koden til å bruka callbacks-greier/flyt. Det verkar litt skjørt. Re concurrency: har du/de lest java concurrency in practice ("tog boka")? Den har tidvis quiz/kontrollspørsmål som testar kunnskapen din. Det er (for meg) ein god mengde gotchas. https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601 Det var litt i ein fart på ting som eg ikkje har kjempegod greie på (godt utgangspunkt for innspel.)

👍 3
Ivar Refsdal12:07:22

forøvrig: eg har brukt clj-async-profiler for å sjekke kva som tek tid i eigen treig kode: https://github.com/clojure-goes-fast/clj-async-profiler i clj-paginate var det, fritt etter hugsen, pr-str som tok mest tid, i/under lokal testing... https://github.com/ivarref/clj-paginate?tab=readme-ov-file#performance

👍 1
teodorlu13:07:38

@UGJE0MM0W bra innspill! Enig om Virtual Threads, det er en god match for eksempelkoden vår. Merk: vi bruker ikke makroene fra core.async i eksempelet vårt, clojure.core.async/pipeline-blocking er en funksjon som opererer på to kanaler (inn og ut), pluss en transducer. Men jeg tror vi lager mange flere ekte tråder enn vi egentlig trenger, så tror vi kunne fått til mye mer parallelisering med virtuelle tråder. Med biten av teksten jeg har skrevet har jeg tenkt at jeg vil holde ting helt håndfast: vise litt man faktisk kan gjøre, uten å nevne alle de andre mulighetene. --- Kanskje virtuelle tråder hadde vært en idé for en del 2? Har du lyst til å skrive selv? Jeg synes det er ganske gøy å bruke Clerk til ting som dette. Deploy er rett fram, Clerk har en funksjon som tar inn en Clojure-fil og lager en index.html og en index.edn. Putt begge bak samme mappe bak en http-server, så er du på nett.

teodorlu13:07:47

> Re concurrency: har du/de lest java concurrency in practice (“tog boka”)? Den har tidvis quiz/kontrollspørsmål som testar kunnskapen din. Det er (for meg) ein god mengde gotchas. https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601 Har ikke lest den—men har fått den anbefalt så mange ganger nå at jeg nesten tror jeg må plukke den opp 😄

🚅 1
Ivar Refsdal17:07:09

re pipeline-blocking: ja, eg fekk med meg det (og det er ein god abstraksjon, trur eg). Re ekte/virtuelle tråder: Sitat frå netty in action frå 2015: > Third, even if a Java virtual machine (JVM) can physically support a very large number of threads, the overhead of context-switching will begin to be troublesome long before that limit is reached, say by the time you reach 10,000 connections[/threads]. Eg les dette som at ein kan bruka opp mot 10 000 vanlege trådar utan problem. Mao. om ein har mindre parallellisering enn det, så treng ein ikkje bry seg om ein fyrer opp f.eks. 1000 trådar. Kanskje eg tek feil. Netty in action brukar 150 000 concurrent connections som eit case der ein treng netty (async). Sidan 2015 har ein vel sikkert fått ein god del fleire kjernar også. Denne artikkelen her skriv godt om slike ting: https://motherduck.com/blog/the-simple-joys-of-scaling-up/

👍 1
isak18:07:52

Virtual threads er veldig imponerende. Ekstremt mye enklere å bruke enn Async i .NET synes jeg. (C# Async ser lett ut, men det er mange gotchas, flere enn de fleste tror.) Enig at man bør holde seg unna core.async, vertfall go macro. Noen sier at resten av core.async, som channels, er bra. Men nå med virtual threads er de ikke like viktig.

leifericf07:07:04

Morn!

☀️ 3
Ruben Sevaldson15:07:54

Takk for gode innspill! Virtual threads virker veldig kult. Noe jeg liker spesielt godt med core.async er at det er inspirert av communicating sequential processes, slik som goroutines i Golang. I den begrensede erfaringen jeg har syntes jeg det har vært ganske fint å jobbe med, spesielt siden jeg er vant til Golang. Liker også at core.async spiller greit på lag med resten av clojure med transducers og slikt. Det jeg liker mindre godt med core.async er at go blocks ikke blir parkert på I/O kall, det blir goroutines i Golang (og jeg tror virtual threads I java og?). Det er ikke en dealbreaker syntes jeg, men litt kinkig å jobbe med. core.async implementert med virtual threads hadde vært kult, så vidt jeg har forstått så har bababashka en modifisert versjon av core.async som gjør det.

Ivar Refsdal12:07:21
replied to a thread:Hvordan får du en Clojure-funksjon til å gå fortere med parallelisering? For https://clojurians.slack.com/archives/C061XGG1W/p1707477511195369 spurte @teodorlu om råd, og fikk innspill fra @augustl, @msolli, @leif.eric.fredheim og @terjesb. Terje skrev til og med ut flere fulle løsninger på problemet uten bruk av annet enn JVM-en. Det viser seg at det finnes flere gode løsninger for å få Clojure-funksjoner til å gå fortere, men det kommer litt an på hva slags jobb du gjør i funksjonene dine. Er det begrenset av CPU? Må du vente mye på andre systemer? Les for å finne ut! Gi gjerne et pip om hva du synes—både om teksten, metoden og `core.async`. Det er tross alt mulig å løse dette med ren JVM, som Terje har vist tidligere. https://play.teod.eu/clojure-easy-parallellism-with-pipeline-blocking/ Hilsen @r.sevaldson og Teodor

Eg dristar meg til å koma med eit innspel: Er det verdt å nemna virtual threads som kom i java 21? Det fjernar mykje av value proposition for core.async på JVM-en? Det er vel uansett berre interessant om ein skal gå "web scale".. (så kva ville eg eigentleg fram til?) Eg har ikkje sett på det sjølv, men core async har også OOM issues, f.eks. https://clojure.atlassian.net/browse/ASYNC-247 mogleg det er fleire/andre. @isak har nemnt det før. Min "takeaway" er at eg ville vore skeptisk til bruk av core.async, iallefall async (!) delen, dvs. det som omskriver koden til å bruka callbacks-greier/flyt. Det verkar litt skjørt. Re concurrency: har du/de lest java concurrency in practice ("tog boka")? Den har tidvis quiz/kontrollspørsmål som testar kunnskapen din. Det er (for meg) ein god mengde gotchas. https://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601 Det var litt i ein fart på ting som eg ikkje har kjempegod greie på (godt utgangspunkt for innspel.)

👍 3