Comprendre Goroutines i Concurrència en Go

Descobreix com Go aprofita goroutines, concurrència i el planificador G M P per oferir eficiència en sistemes multicore. Contacta amb Q2BSTUDIO per desenvolupar programari a mida i solucions en intel·ligència artificial, ciberseguretat i serveis cloud.

sábado, 16 de agosto de 2025 • 4 min de lectura • Equip Q2BSTUDIO

Intel·ligència-Artificial-

Entendre goroutines, concurrència i el planificador en Go: aquest article explica de manera clara què passa quan llancem goroutines i com el runtime de Go aprofita processadors multicore per oferir concurrència i, quan és possible, paral·lelisme.

Concurrència vs Paral·lelisme: la concurrència és la capacitat d'estructurar un programa com a tasques que progressen de manera independent; no sempre s'executen al mateix temps però avancen sense bloquejar el disseny global. El paral·lelisme implica l'execució simultània real de diverses tasques sobre maquinari que ho permet.

Goroutine: una goroutine és un fil d'execució lleuger gestionat per l'usuari dins del runtime de Go. A diferència d'un fil del sistema operatiu, les goroutines són molt barates de crear, amb stacks inicials petits, i poden escalar a milions sense esgotar el sistema. Per llançar una goroutine n'hi ha prou amb escriure go doWork() i el scheduler de Go s'encarrega d'executar-la concurrentment.

Model del scheduler de Go: G M P. Go utilitza un planificador M:N. Moltes goroutines G es multiplexen sobre un nombre menor de fils del sistema M, coordinats per processadors lògics P. Components: G per goroutine, M per màquina o fil del sistema operatiu, i P per processador lògic, el context necessari per executar codi Go. Només un M amb un P associat pot executar codi Go en un instant donat.

Com treballen junts: cada P manté una cua local de goroutines llestes per executar. Un P s'adjunta com a màxim a un M alhora. Un M executa una sola goroutine G alhora. Si una goroutine bloqueja per I/O o una altra operació, el M pot desprendre's i el P es reassigna perquè un altre M continuï l'execució.

En iniciar moltes goroutines: si llancem, per exemple, milers o centenars de milers de goroutines, Go crea diversos P segons GOMAXPROCS i el runtime crea M suficients per executar aquests P. Les goroutines es distribueixen a les cues locals dels P i s'executen una a una en cada P utilitzant un M. El scheduler gestiona finalitzacions i bloquejos i selecciona la següent goroutine disponible.

Canvi de context i concurrència: atès que el nombre de goroutines sol ser més gran que el nombre de P o fils de CPU, Go utilitza canvi de context per simular execució concurrent. Quan una goroutine bloqueja es pausa, es guarda el seu estat (program counter, stack pointer, etc.) i el P tria una altra goroutine executable. Molt d'això passa en espai d'usuari, cosa que evita crides al sistema costoses i fa el canvi ràpid.

Exemple amb un sol nucli: encara que només hi hagi un nucli físic, el scheduler de Go alterna ràpidament entre goroutines, creant la il·lusió de concurrència. Això combina planificació cooperativa i planificació preventiva per permetre que múltiples goroutines progressin en una sola CPU.

Relacions i límits: P a M és 1 a 1 en un moment donat; un P s'assigna a un M i si el M bloqueja el scheduler busca un altre M lliure. P a G és 1 a molts, un P manté una cua amb moltes G però n'executa una per vegada. M a G també és 1 a 1 en execució, un M executa la goroutine que el P li entrega.

Work stealing i cua global: si la cua local d'un P queda buida pot robar treball de la cua d'un altre P o prendre tasques d'una cua global de reserva. Això equilibra la càrrega i manté ocupats els processadors perquè les goroutines es distribueixin de manera eficient.

Paral·lelisme en CPUs multicore: en una màquina amb 8 nuclis i 16 fils lògics, GOMAXPROCS sol establir-se en 16 per defecte, cosa que permet fins a 16 goroutines executant-se en paral·lel, una per fil lògic. La resta de goroutines es planifiquen cooperativament, per la qual cosa els programes Go aprofiten tant el paral·lelisme real com la concurrència en sistemes més limitats.

Eines i diagnòstic: per aprofundir es poden utilitzar runtime/trace, pprof i go tool trace per visualitzar comportaments de goroutines durant l'execució i entendre colls d'ampolla, bloquejos i eficiència del scheduler.

Aplicacions reals i Q2BSTUDIO: a Q2BSTUDIO som especialistes en desenvolupament de programari a mida i aplicacions a mida que aprofiten la concurrència i el rendiment de Go quan correspon. Oferim solucions de programari a mida, intel·ligència artificial i IA per a empreses, agents IA, serveis d'intel·ligència de negoci i power bi per a visualització avançada. També proporcionem ciberseguretat, serveis cloud aws i azure i integració de models d'intel·ligència artificial en aplicacions empresarials.

Per què triar Q2BSTUDIO: dissenyem arquitectures escalables i segures que utilitzen les millors pràctiques en concurrència i paral·lelisme, desenvolupem programari a mida optimitzat per a microserveis i aplicacions d'alt rendiment, implementem solucions d'intel·ligència artificial i agents IA per automatitzar processos i oferir insights a través de serveis d'intel·ligència de negoci. Les nostres capacitats en ciberseguretat i serveis cloud aws i azure asseguren desplegaments fiables i protegits en entorns cloud.

Resum i crida a l'acció: comprendre com Go gestiona les goroutines, el scheduler G M P, l'equilibri de cues i l'execució en múltiples nuclis ajuda a dissenyar sistemes més eficients. Si vols que el teu projecte aprofiti concurrència real, paral·lelisme i capacitats d'intel·ligència artificial, contacta amb Q2BSTUDIO per desenvolupar programari a mida, aplicacions a mida i solucions avançades en intel·ligència artificial, ciberseguretat, serveis cloud aws i azure, serveis d'intel·ligència de negoci, agents IA i power bi.

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.