Найти Ρ‚Π΅ΠΌΡƒ
2014 подписчиков

πŸ¦«Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Go


НапишСм Go-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для создания сСрвСра, способного ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ мноТСство соСдинСний ΠΈ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π½ΠΈΠΌΠΈ.

Go-сСрвСр ΠΏΠΎΡ…ΠΎΠΆ Π½Π° офисного сСкрСтаря, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π²ΠΎΠ½ΠΊΠΈ (сСтСвыС соСдинСния), Π²Π΅Π΄Π΅Ρ‚ ΡƒΡ‡Π΅Ρ‚ Π·Π²ΠΎΠ½ΠΊΠΎΠ² (Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…) ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с нСсколькими людьми ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… соСдинСний).

ΠžΡ‚ΠΏΡ€Π°Π²Π½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°: ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
НачнСм с ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:
import (
"context"
"log"
"net"
"os"
"time"

"golang.org/x/sync/semaphore"
)

Π­Ρ‚ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ инструмСнты для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСтями, логирования, управлСния контСкстами ΠΈ использования сСмафоров. β€œΠ‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹β€ β€” это ΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ количСством ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссов.

ΠŸΠ°ΠΊΠ΅Ρ‚ Semaphore
Π’ Go ΠΏΠ°ΠΊΠ΅Ρ‚ semaphore ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ограничСния количСства ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ свСтофора. Он управляСт ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ машин (комплСксом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±ΠΊΠΈ (Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ΅ использованиС рСсурсов).

Π§Ρ‚ΠΎ касаСтся ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ здСсь semaphore ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ количСство соСдинСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сСрвСр ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
Главная функция β€” это Ρ‚ΠΎ мСсто, Π³Π΄Π΅ начинаСтся магия. ИмСнно ΠΎΠ½Π° настраиваСт Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ создаСт сСтСвого ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎΡ‚ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ входящих соСдинСний, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠ΅ΠΊΡ€Π΅Ρ‚Π°Ρ€ΡŽ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΌΡƒ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠ³ΠΎ Π·Π²ΠΎΠ½ΠΊΠ°.

func main() {
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сСмафор с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ вСсом maxConcurrentConnections.
sem = semaphore.NewWeighted(maxConcurrentConnections)

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» Π»ΠΎΠ³Π°.
logFile, err := os.OpenFile("network.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Error opening log file: %v", err)
}
defer logFile.Close()

// УстанавливаСм Π²Ρ‹Π²ΠΎΠ΄ Π»ΠΎΠ³Π΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Ρ„Π°ΠΉΠ» Π»ΠΎΠ³Π°.
log.SetOutput(logFile)

// ΠŸΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌ входящиС соСдинСния.
l, err := net.Listen("tcp", ":2000")
if err != nil {
log.Fatalf("Error listening: %v", err)
}

// Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ прилоТСния.
defer func() {
if err = l.Close(); err != nil {
log.Printf("Error closing listener: %v", err)
}
}()
log.Println("Listening on localhost:2000")
// ...
}


1 ΠΌΠΈΠ½ΡƒΡ‚Π°