# #python #go #redis
Вопрос:
Я использую goredis, и, насколько я вижу, при подключении клиента к серверу redis существует пул соединений. Я не знаю, как запросить сервер redis и убедиться, что он работает в потокобезопасном режиме.
В настоящее время я делаю это:
Я создаю глобальный указатель client
: client *goredis.Redis
Затем я делаю это:
go func () {
http.HandleFunc("/send_data/", trackHandler)
http.HandleFunc("/init/", initHandler)
http.ListenAndServe(":8000", nil)
} ()
Итак, теперь я хочу использовать client
in trackHandler
и initHandler
, но я обеспокоен тем, что при выполнении запросов никак не происходит синхронизации. Можно ли так все испортить? Каков канонический способ решения этой проблемы в голанге?
Также мне интересно, как это работает в redis-py. Я видел эту тему:
В общем, я предлагаю вам либо:
a. создайте глобальный экземпляр клиента redis и используйте его в своем коде. b. создайте глобальный пул соединений и передайте его различным экземплярам redis на протяжении всего кода.
Оба они достигают одного и того же. Оба они являются потокобезопасными.
Как это делается в первом сценарии?
Комментарии:
1. какой клиент redis вы используете? github.com/xuyu/goredis ?
Ответ №1:
У клиента есть пул соединений, который является потокобезопасным, и всякий раз, когда вы выполняете команду, клиент пытается получить соединение из пула. Таким образом, даже несмотря на то, что у клиента нет блокировки, он по-прежнему потокобезопасен, поэтому вы должны быть в порядке с глобальным клиентом.
Смотрите здесь — как функция набора номера создает новый пул соединений: https://github.com/xuyu/goredis/blob/master/redis.go#L432
А вот пример блокировки в самом пуле connectino. https://github.com/xuyu/goredis/blob/master/redis.go#L287
Re redis-py — Он создает свой собственный внутренний пул соединений, если вы не используете его явно, поэтому он потокобезопасен, потому что под капотом соединения объединяются в глобальный пул. В принципе, то же самое.
Комментарии:
1. Спасибо вам за ваш ответ. Мои заблуждения касаются того, когда что-то считается потокобезопасным. Нормально ли, если вы вызываете одну и ту же функцию из разных потоков/подпрограмм? Есть ли проблемы только с записью данных. Я действительно буду признателен за более подробный ответ о безопасности потоков в целом или ссылку на соответствующие материалы. 🙂
2. @cldy в целом — функции и все, что создается в стеке (временно во время выполнения функции), считается потокобезопасным и не используется совместно потоками. Как только у вас есть данные, к которым одновременно обращаются и изменяют разные потоки, все становится сложнее. Я предлагаю вам просто погуглить «безопасность потоков», и вы найдете бесконечное количество ресурсов 🙂