Nikita
тогда ты хочешь сделать generic repository, что тоже считается вредным
🏁Александр
ранее использовал для запросов https://github.com/leesper/couchdb-golang
🏁Александр
там на https://github.com/leesper/couchdb-golang/blob/master/database.go просто возращают map[string]interface{}
🏁Александр
на любой запрос
Artem
а кто-нибудь использует клиент к реббиту? Я как-то не очень понял. Поверх него надо пул коннектов наворачивать?
🏁Александр
можно конечно и так сделать
🏁Александр
но я думал выпедриться и сразу сэкономить
🏁Александр
ну хз как делать 🙁
Anonymous
а кто-нибудь использует клиент к реббиту? Я как-то не очень понял. Поверх него надо пул коннектов наворачивать?
Йа. У меня без пула. Один коннект и несколько сессий, ЕМНИП. После обрыва связи просто реконнект. Но у меня довольно тривиальный кейс и этого хватает :)
Michael
пул коннектов раббиту не нужен
Michael
асинхронно диспатчить сообщения надо
Artem
ну вот я тоже думаю. Накидать данных потом confirmation ждать
Artem
а что такое “несколько сессий” ?
p0rsche
топовый ник
Anonymous
а что такое “несколько сессий” ?
Глянул в код. Не сессий. Каналов :) Давно это было ...
Mike
Огонь, спасибо)
сук, где такие ники раздают?)
Artem
сук, где такие ники раздают?)
При советской власти по блату. В комитете никнеймов. Было дело в москву за никами ездили. А у меня у знакомого дядя ездил заграницу. Такие классные ники привозил, чехословацкие
Darwin
в электричках из москвы всегда никами пахло
Darwin
все за никами ездили
Pawel
использовать sync.Pool в качестве стека - это вообще норм?
Daniel
Вроде, нет
🎉
а так http.Handle и http.HandleFunc полностью взаимозаменемы https://play.golang.org/p/c9h4-lEn1tR
Вот посмотрел в доку, и по моему ничего не взаимозаменяемо: func main() { r := mux.NewRouter() r.HandleFunc("/", HomeHandler) r.HandleFunc("/products", ProductsHandler) r.HandleFunc("/articles", ArticlesHandler) http.Handle("/", r) } Вот в этом примере HomeHandler это: func HomeHandler (w http.ResponseWriter, r *http.Request) { ... } Напрямую сделать например так: r.Handle("/", HomeHandler(m)) func HomeHandler(m *Xwz) http.Handler { ... return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ... }) ... } не получится. Может я чего-то не допонимаю.
Pawel
Оо Каким образом?
ну типа в одной горутине положил в пул таск например, из другой взял и выполнил
Мерль
ну типа в одной горутине положил в пул таск например, из другой взял и выполнил
любой объект из sync.Pool может быть собран в любой момент GC
Pawel
скажем, порядок не важен
Мерль
ты описал ровно то, для чего нужен канал
Anonymous
Канал?!
ну, их тоже можно так использовать )))
Pawel
я понял
Subbotin
народ, а вроде был какой-то код http который говорил что типа я тут делаю запрос в какую-то внешнюю подсистему и она не работает
Subbotin
а че модно использовать? пятисотить?
Subbotin
это какие-то фантазии клаудфары или они таки внесли в стандарт?
Artem
а че модно использовать? пятисотить?
нормальные ошибки с текстом
Subbotin
а код при этом какой?
Subbotin
без кода ошибку не положено
Artem
а код при этом какой?
500, других вариантов нет. http коды не про прикладной уровень
Pawel
ты описал ровно то, для чего нужен канал
а если например выполнение таска - не быстрая операция, которая не должна блочить вставку в канал? в этом случае логика "взял таск- выполнил - жду следующий" не работает и хотелось бы иметь именно стек потокобезопасный
Мерль
а если например выполнение таска - не быстрая операция, которая не должна блочить вставку в канал? в этом случае логика "взял таск- выполнил - жду следующий" не работает и хотелось бы иметь именно стек потокобезопасный
сделай буферезированный канал и нарасти количество воркеров в любом случае если ты обрабатываешь таски медленнее чем получаешь, то у тебя очерель переполнится так или иначе
🎉
почеу не получится?
Всё получилось, но это очень для меня странно, и не знаю насколько криво. import ( "net" "net/http" "time" h "MyApp/handler" "MyApp/model" "github.com/gorilla/mux" ) // Start ... func Start(m *model.Model, listener net.Listener) { r := mux.NewRouter() server := &http.Server{ Handler: r, WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } r.Handle("/", h.Index(m)) r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) http.Handle("/", r) go server.Serve(listener) }
Artem
Глянул в код. Не сессий. Каналов :) Давно это было ...
я просто смотрю примеры. Там кароч сначала подключение к кролю. Потом там вызывается conn.Channel(). Судя по всему надо их несколько создавать же да?
Daniel
А он размерами не ограничен. Можно OOM килера сумонить невозбранно
Artem
о! и вот тут уже можно будет навернуть пул
Pawel
и как стек тебе сделает лучше по сравнению с каналом в данном случае?
мне это проще для себя прелставить - контейнер, в который одна горутина put, а другая pop
Anonymous
я просто смотрю примеры. Там кароч сначала подключение к кролю. Потом там вызывается conn.Channel(). Судя по всему надо их несколько создавать же да?
Да, подключение, потом открытие канала. У меня используется один канал для входящих сообщений, и потом на каждый ответ открывается еще один. Но почему сделал именно так — уже не помню :D
Мерль
А он размерами не ограничен. Можно OOM килера сумонить невозбранно
если уж пошла такая пьянка, то тогда внешнее персистентное хранилище прикручивать
Anonymous
я просто смотрю примеры. Там кароч сначала подключение к кролю. Потом там вызывается conn.Channel(). Судя по всему надо их несколько создавать же да?
Ага ... мне нужно записать ответ, в очередь которая уже существует (создана раньше), и там стоит проверка на существование данной очереди ... если её нет, то канал будет закрыт (самим кролем), вроде так
Pawel
ну, канал
единственное различие что в буф.канале длина статическая, а размер стека динамический
Мерль
единственное различие что в буф.канале длина статическая, а размер стека динамический
ну, если ты сделаешь быстрый потокобезопасный стек, то вперёд конечно )
Мерль
кто я такой чтобы отговаривать писать костыли
Pawel
нене, я как бы предпочту канал, а стек я уже делал, и он не очень
Daniel
есть пропозал про неограниченный в размере канал https://go.googlesource.com/proposal/+/aca4b23cec23a4c97c8aac4df5f7f819eead08a8/design/27935-unbounded-queue-package.md
Мерль
просто такой момент если у вас очень много задач в канале, которые ещё и тяжёлые, вам не стрёмно это без сброса на диск использовать?
Daniel
но я поставил - - это не только не нужно, но и вредно
Евгений
А зачем NEO пишет контракты на Go? https://github.com/CityOfZion/neo-storm/blob/master/examples/token/token.go#L30
Daniel
сейчас почти весь блокчейн на go
Евгений
Там такой же код?
Daniel
почему - хз
Pawel
просто такой момент если у вас очень много задач в канале, которые ещё и тяжёлые, вам не стрёмно это без сброса на диск использовать?
в данном случае опрос железа с малинки, так что нет, не стрёмно. не ответила железка - и не надо.
Евгений
сейчас почти весь блокчейн на go
А кто еще из крупных, заметных?
Pawel
но впрочем спсибо за очевидное решение, а то я чет затупил
Евгений
Изьвинити, но такое лучше писать на PHP: if operation == "transfer" && CheckArgs(args, 3) { from := args[0].([]byte) to := args[1].([]byte) amount := args[2].(int) return token.Transfer(ctx, from, to, amount) }
Евгений
или JS или еще чем нетипизированном