Добавлена обработка отмены контекста в горутине компиляции регулярных выражений для предотвращения блокировок. Оптимизирован алгоритм ожидания в ограничителе частоты, улучшая управление блокировками.

This commit is contained in:
Struchkov Mark
2025-12-04 21:30:24 +03:00
parent e30d50fed7
commit 21cfe56a0b
2 changed files with 7 additions and 3 deletions

View File

@@ -67,7 +67,11 @@ func getCompiledRegex(pattern string) (*regexp.Regexp, error) {
go func() { go func() {
regx, err := regexp.Compile("(?i)" + pattern) regx, err := regexp.Compile("(?i)" + pattern)
resultCh <- result{regx: regx, err: err} select {
case resultCh <- result{regx: regx, err: err}:
case <-ctx.Done():
// Context cancelled, goroutine exits without blocking
}
}() }()
select { select {

View File

@@ -7,7 +7,6 @@ import (
"strconv" "strconv"
"sync" "sync"
"time" "time"
"unicode/utf8"
"github.com/pyed/transmission" "github.com/pyed/transmission"
tgbotapi "gopkg.in/telegram-bot-api.v4" tgbotapi "gopkg.in/telegram-bot-api.v4"
@@ -40,7 +39,6 @@ var (
// wait waits for the next available slot using token bucket algorithm // wait waits for the next available slot using token bucket algorithm
func (rl *rateLimiter) wait() { func (rl *rateLimiter) wait() {
rl.mu.Lock() rl.mu.Lock()
defer rl.mu.Unlock()
// Refill tokens based on elapsed time // Refill tokens based on elapsed time
now := time.Now() now := time.Now()
@@ -51,6 +49,7 @@ func (rl *rateLimiter) wait() {
// If we have tokens, consume one and return immediately // If we have tokens, consume one and return immediately
if rl.tokens >= 1.0 { if rl.tokens >= 1.0 {
rl.tokens -= 1.0 rl.tokens -= 1.0
rl.mu.Unlock()
return return
} }
@@ -64,6 +63,7 @@ func (rl *rateLimiter) wait() {
rl.mu.Lock() rl.mu.Lock()
rl.tokens = 0.0 // Consume the token rl.tokens = 0.0 // Consume the token
rl.lastRefill = time.Now() rl.lastRefill = time.Now()
rl.mu.Unlock()
} }
// min returns the minimum of two float64 values // min returns the minimum of two float64 values