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 ΠΌΠΈΠ½ΡΡΠ°
31Β ΠΈΡΠ»ΡΒ 2023