170 похожих чатов

Использую такую реализацию очереди с получением значений по ключу, но

иногда все же вылетает баг, когда при получении клиента по id выдает nil. Из-за чего такое может быть?
type checkQueue struct {
mu sync.Mutex
queue map[int]*Client
}

// Inc increments the counter for the given key.
func (c *checkQueue) Add(value *Client) int {
c.mu.Lock()
idx := len(c.queue) + 1
c.queue[idx] = value
c.mu.Unlock()
return idx
}

func (c *checkQueue) Get(key int) *Client {
return c.queue[key]
}

func (c *checkQueue) Remove(key int) {
c.mu.Lock()
delete(c.queue, key)
c.mu.Unlock()
}

37 ответов

11 просмотров

Такого айди не было в мапе или вы в этот ключ сами положили Нил?

А что произойдет, если добавить 2 клиента, потом 1 удалить и добавить ещё Ключи будут такие 1,2 2 2 То есть 3ий юзер перетрет второго.

На Get нет лока

️Skill- Автор вопроса
Aleksey Sychev
А что произойдет, если добавить 2 клиента, потом 1...

офигеть, и правда надо переписывать логику. Спасибо

️Skill- Автор вопроса
Roman Timofeev
На Get нет лока

а он точно нужен?

А почему мапа для очереди?

️Skill- Автор вопроса
Roman Timofeev
А почему мапа для очереди?

первое, что в голову пришло. Есть вариант получше(кроме специализированных баз данных)?

Очередь на map - это как то странно. Обычно связанный список используют. Я делал на container/list.

️Skill- Автор вопроса
Виталий Фунтиков
Очередь на map - это как то странно. Обычно связан...

это не совсем очередь, сделал так, чтобы при последующих запросах на сервер не создавать нового клиента

️Skill- Автор вопроса
Виталий Фунтиков
Ну тогда это кэш.

видимо да, его тоже лучше мапой не реализовывать?

️Skill
видимо да, его тоже лучше мапой не реализовывать?

Map для кэша подходит. Есть правда проблема с утечкой памяти.

️Skill
видимо да, его тоже лучше мапой не реализовывать?

Только вот с вашим кодом будет гонка. То есть когда в кэше не записи - вполне возможно что несколько потоков захотят добавить одного и того же клиента в кэш.

️Skill- Автор вопроса
Виталий Фунтиков
Только вот с вашим кодом будет гонка. То есть когд...

почему? я ведь использую мютекс при изменении данных

️Skill- Автор вопроса
Виталий Фунтиков
Только вот с вашим кодом будет гонка. То есть когд...

"одного и того же" на сервер приходят запросы, на каждый запрос один клиент

️Skill
почему? я ведь использую мютекс при изменении данн...

Я не про изменение, а про добавление. Тут только нужно понять, что id у вас представляет.

️Skill- Автор вопроса
Виталий Фунтиков
Я не про изменение, а про добавление. Тут только н...

func randHexID() string { bytes := make([]byte, 4) rand.Read(bytes) return hex.EncodeToString(bytes) } решил вместо числовых айди использовать такой

️Skill
"одного и того же" на сервер приходят запросы, на ...

Ок. Забыли мой наброс. У вас id создаётся внутри Add с локом. Тут все ок.

️Skill
func randHexID() string { bytes := make([]byte, ...

А почему бы не использовать uuid? Рандому я бы тут не доверял.

️Skill- Автор вопроса
Виталий Фунтиков
Map для кэша подходит. Есть правда проблема с утеч...

Если использовать uuid как ключ, при добавлении/удалении нужно делать блокировку?

️Skill- Автор вопроса
️Skill
Если использовать uuid как ключ, при добавлении/уд...

Или в каких случаях её не стоит делать?

️Skill
Если использовать uuid как ключ, при добавлении/уд...

Тип ключа не влияет на необходимость использовать mutex. Влияет именно то, какие действия совершаются с ресурсом.

️Skill
Или в каких случаях её не стоит делать?

Честно говоря не совсем понятно что у вас такое Client. От этого зависят дальнейшие советы.

️Skill- Автор вопроса
️Skill
Он делает запросы на сторонний сервер

Тогда вам нужен не кэш, а пул соединений (клиентов)...

Виталий Фунтиков
Ок. Забыли мой наброс. У вас id создаётся внутри A...

Не ок, т.к. ключ формируется как len + 1, а гарантий что ключ 4 будет удален после ключа 5 нет

️Skill- Автор вопроса
Виталий Фунтиков
Тогда вам нужен не кэш, а пул соединений (клиентов...

Программа, которая делает запросы на мой сервер многопоточна(300 одновременных соединений), в границах одного потока должен быть один и тот же клиент Структура клиента такая type Client struct { Proxy string client *fasthttp.Client User *User }

️Skill- Автор вопроса
Виталий Фунтиков
Тогда вам нужен не кэш, а пул соединений (клиентов...

То есть лучше сделать список и добавлять/удалять оттуда клиентов?

️Skill
То есть лучше сделать список и добавлять/удалять о...

Почитайте про connection pool. Может вам подойдёт. Основная идея - возможность ограничить кол-во одновременно открытых соединений.

Используй для key 4-tuple соединения с клиентом(dst addr:port + src addr:port)

️Skill
это не совсем очередь, сделал так, чтобы при после...

А как ты клиентов между собой различаешь, кстати?

️Skill- Автор вопроса
️Skill- Автор вопроса
️Skill
Получение, добавление, удаление

На самом деле ещё есть работа с ресурсом. Обычно это изменение. То есть в вашем случае - нужно гарантировать, что другой процесс не сможет работать с уже занятым клиентом.

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
Я короче решил скомпилировать Nim в js, я думал он сработает как обычный транслятор. По итогу он мне создал файл с расширением js, и туда поместил кучу кода Вопрос, что это з...
𝕾𝖍𝖆𝖉𝖊 <suspense>
9
Всем здравствуйте!) У меня такой вопрос. Есть два роута, роут1 и роут2. Они связаны с очередью some_queue. По задаче предполагается, что есть два паблиша. Паблиш1 отправляет...
Format
10
это группа токсиков или тех кто помогает?
Ибрагим
9
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
мы пытаемся подменить функцию, которая имеет меньше инструкций относительно функции, которой подменяем. https://www.reddit.com/r/jailbreakdevelopers/comments/w06ujy/mshookfun...
Óðinn
6
Карта сайта