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 ответов

31 просмотр

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

А что произойдет, если добавить 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
Получение, добавление, удаление

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта