Size: a a a

2020 August 16

Н

Никита in Go-go!
Владимир Столяров
А не проще тогда тупо пробросить stdin и stdout по вебсокету на фронт
источник

⛪️Поп Гапон⛪️... in Go-go!
DORIAN GRAY
Подскажите в чем отличие от буферезированного канала с размером 1 от небуфиризированного
Если в буферезированном канале будет 1 значение и никто его не читает, его удалит сборщик мусора, небуферезированный будет висеть и ждать когда в него напишут
источник

ВС

Владимир Столяров... in Go-go!
Каналы не обязательно использовать даже, io.Pipe или отдача io.ReaderWriter отлично работает
источник

Н

Никита in Go-go!
Владимир Столяров
Каналы не обязательно использовать даже, io.Pipe или отдача io.ReaderWriter отлично работает
хм, думал они тут необходимы. Но как я понимаю, на уровне взаимодействия с вебсокетом у нас должна быть горутина, которая будет выполнять чтение stdout и писать в вебсокет, а также горутина, которая будет читать данные с вебсокета и закидывать в stdin
источник

ВС

Владимир Столяров... in Go-go!
Да, вы правы
источник

Н

Никита in Go-go!
Спасибо, буду пробовать
источник

ВС

Владимир Столяров... in Go-go!
Если понадобится мультиплексировать stdout и stderr, а также команды смены размера окна терминала, посмотрите на protobuf
источник

ВС

Владимир Столяров... in Go-go!
На js и go сериализация работает отлично и api довольно удобное
источник

Н

Никита in Go-go!
Отлично, спасибо 👍🏻
источник

AS

Andrey S in Go-go!
⛪️Поп Гапон⛪️
Если в буферезированном канале будет 1 значение и никто его не читает, его удалит сборщик мусора, небуферезированный будет висеть и ждать когда в него напишут
разве сборщик мусора не удаляет каналы из которых не читают в принципе?
источник

D

DORIAN GRAY in Go-go!
⛪️Поп Гапон⛪️
Если в буферезированном канале будет 1 значение и никто его не читает, его удалит сборщик мусора, небуферезированный будет висеть и ждать когда в него напишут
func main() {
 lock := make(chan bool, 1)
 for i := 1; i < 5; i++ {
   go worker(i, lock)
 }
 time.Sleep(10 * time.Second)
}

func worker(id int, lock chan bool) {
 fmt.Printf("%d wants the lock\n", id)
 lock <- true
 fmt.Printf("%d has the lock\n", id)
 time.Sleep(500 * time.Millisecond)
 fmt.Printf("%d is releasing the lock\n", id)
 <-lock
}


То есть тут оно дойдёт в горутине до слипа и очистит буфер?
источник

AS

Andrey S in Go-go!
DORIAN GRAY
func main() {
 lock := make(chan bool, 1)
 for i := 1; i < 5; i++ {
   go worker(i, lock)
 }
 time.Sleep(10 * time.Second)
}

func worker(id int, lock chan bool) {
 fmt.Printf("%d wants the lock\n", id)
 lock <- true
 fmt.Printf("%d has the lock\n", id)
 time.Sleep(500 * time.Millisecond)
 fmt.Printf("%d is releasing the lock\n", id)
 <-lock
}


То есть тут оно дойдёт в горутине до слипа и очистит буфер?
"настоящие пацаны" в этому случае используют chan struct{} а не chan bool
источник

D

DORIAN GRAY in Go-go!
Andrey S
"настоящие пацаны" в этому случае используют chan struct{} а не chan bool
Это пример из учебника. Просто при буф. канале с размером один выводит вот такое
4 has the lock
1 wants the lock
2 wants the lock
3 wants the lock
4 is releasing the lock
1 has the lock
источник

D

DORIAN GRAY in Go-go!
Andrey S
"настоящие пацаны" в этому случае используют chan struct{} а не chan bool
А при не буф. канале такое
4 wants the lock
1 wants the lock
2 wants the lock
3 wants the lock
источник

AS

Andrey S in Go-go!
DORIAN GRAY
А при не буф. канале такое
4 wants the lock
1 wants the lock
2 wants the lock
3 wants the lock
при не буферизированном все повиснут - не одна не сможет записать потому как ни одна не читает в этот момент
источник

D

DORIAN GRAY in Go-go!
Andrey S
"настоящие пацаны" в этому случае используют chan struct{} а не chan bool
Хотя в учебнике написано
При использовании каналов в роли блокировок часто реализуется
следующий сценарий:
1.  Функция устанавливает блокировку, отправляя сообщение
в канал.
2. Продолжает выполнение критичных операций.
3. Освобождает блокировку, читая сообщение из канала.
4.  Любая функция, попытавшаяся установить блокировку до ее
снятия, будет приостановлена в при попытке выполнить запись
в канал (заблокируется).

И по логике при буф канале пока не будет выведено 4 is releasing the lock не должны выводится остальные сообщения
источник

AS

Andrey S in Go-go!
не одна горутина
источник

AS

Andrey S in Go-go!
DORIAN GRAY
Хотя в учебнике написано
При использовании каналов в роли блокировок часто реализуется
следующий сценарий:
1.  Функция устанавливает блокировку, отправляя сообщение
в канал.
2. Продолжает выполнение критичных операций.
3. Освобождает блокировку, читая сообщение из канала.
4.  Любая функция, попытавшаяся установить блокировку до ее
снятия, будет приостановлена в при попытке выполнить запись
в канал (заблокируется).

И по логике при буф канале пока не будет выведено 4 is releasing the lock не должны выводится остальные сообщения
оно так и есть
источник

ВС

Владимир Столяров... in Go-go!
DORIAN GRAY
Хотя в учебнике написано
При использовании каналов в роли блокировок часто реализуется
следующий сценарий:
1.  Функция устанавливает блокировку, отправляя сообщение
в канал.
2. Продолжает выполнение критичных операций.
3. Освобождает блокировку, читая сообщение из канала.
4.  Любая функция, попытавшаяся установить блокировку до ее
снятия, будет приостановлена в при попытке выполнить запись
в канал (заблокируется).

И по логике при буф канале пока не будет выведено 4 is releasing the lock не должны выводится остальные сообщения
Интересно, а зачем тут канал, мьютекс же есть
источник

D

DORIAN GRAY in Go-go!
Andrey S
оно так и есть
А да. туплю
источник