Size: a a a

2021 June 04

PK

Phil Kulin in Go-go!
А. Ну у меня по одной "трубе" ходят сообщения ко многим ответчикам. Там поэтому и нужна асинхронщина в том числе и отправки. Упрощается тем, что хоть не параллельно
источник

ЯК

Ярослав Коробейников... in Go-go!
нЭт) хочу рекурсивную нарезку)
источник

PK

Phil Kulin in Go-go!
Т.е. это норм?
источник

с

сонная википедия... in Go-go!
конечно
источник

PK

Phil Kulin in Go-go!
Или канал в одно значение тоже норм?
источник

AS

Andrei 🦉 Sergeev in Go-go!
в тесте почти все что угодно норм, это же тест
источник

с

сонная википедия... in Go-go!
я бы сразу стал использовать errgroup, потому что там есть контексты и потому что не дает горутинам из теста утечь, видно дедлоки будет
источник

VY

Vladislav Yarmak in Go-go!
да, это по сути один из способов реализовать futures в go
источник

VY

Vladislav Yarmak in Go-go!
мне нравится как в какой-то питонячей либе обыграли такую же ситуацию с запросом-ответом
источник

VY

Vladislav Yarmak in Go-go!
там есть либа для вебсокетов и функция ping возвращает футуру, которая будет выполнена, когда придёт соответствующий понг
источник

VY

Vladislav Yarmak in Go-go!
в го ещё иногда коллбэком делают
источник

VY

Vladislav Yarmak in Go-go!
источник

PK

Phil Kulin in Go-go!
// message - сообщение устройству.
type message struct {
 feedback chan<- []byte // куда ответить
 data     []byte        // само сообщение (c адресом и командой)
 deadline time.Time     // дедлайн отправки
}

//...

// Send - отправляет сообщение (по таймеру вызывается в цикле).
func  Send(conn units.Caller) bool {
 resp, err := conn.Call(me.msg.data)
 timestamp := time.Now()

 if err != nil  {
   me.attempts++

   if me.attempts >= MsgDeliveryMaxAttempts || timestamp.After(me.msg.deadline) {
     me.done(nil)

     return true
   }

   return true
 }

 me.done(resp)

 return true
}

//...

// done - возвращает ответ и чистит сообщение.
func done(data []byte) {
 select {
 case msg.feedback <- data:

 default:
 }

 close(msg.feedback)
 me.msg = nil
 me.attempts = 0
 me.sign = 0
}
источник

DF

Durty Free in Go-go!
Это можно поменять прям перед сборкой, будут к примеру хэши вместо названий.
источник

AD

Alex Dok in Go-go!
А всегда 2,5,2,10?
источник

AD

Alex Dok in Go-go!
И какие же могут быть серваки и как это влияет, о мудрейший)
источник

PK

Phil Kulin in Go-go!
func Test_Send(t *testing.T) {
 conn := &echoConn{} // мок

                          // вкратце - возвращает тот канал message.feedback
 repl, err := Put([]byte{1, 2, 3, 4})
 if err != nil {
   t.Errorf("Putting error: %s", err)
 }

 if !Send(conn) {
   t.Error("Send could not shift")
 }

 select {
 case <-repl:
 default:
   t.Error("No reply")
 }
}
источник

PK

Phil Kulin in Go-go!
Собственно мне тут или перед Send надо то, что ниже, в горутину пихать, или канал буферизированный делать
источник

DF

Durty Free in Go-go!
Разные, любезнейший. Сервер для прода компании, и t2.micro для пет проджекта, они таки разные. 😊
источник

DF

Durty Free in Go-go!
В первом случае можно ci/cd прикрутить, во втором пулять через git хуки.
источник