Size: a a a

2021 May 25

🦄

🦄 in Go-go!
хотя нет, он из темплейта берет
By default, the new database will be created by cloning the standard system database template1.
источник

RA

Ruslan Askme in Go-go!
Привет. Подскажите, почему при множестве запусков вывод разный ? https://play.golang.org/p/W17cgfCS22k
По идее, после отправки значения в ch1, главная горутина заблокируется и управление передастся во вторую, где будет считано значения и выведено две строки. После, управление вернется в главную и выведется оставшийся Println. Но порой, вывод может быть вот таки:
GO: get from chan
MAIN: after put to chan
GO: after read from chan
и даже таким
MAIN: after put to chan
GO: get from chan
GO: after read from chan
Все зависит от планировщика и впринципе такая смена контекста это норма ?
источник

🦄

🦄 in Go-go!
в общем баффало тот еще инструмент )
я бы через консоль эту таблицу попробовал сделать и посмотреть че он скажет на тот же прогон — увидит ли ее
источник

F

Fenrir in Go-go!
вероятно да, т.к. я создал успешно новую БД запросом create database testdb; без БД postgres.
источник

RA

Ruslan Askme in Go-go!
Получается, что даже при использовании каналов, как средство синхронизации между горутинами нельзя гарантировать объяснимую последовательность действий ?
источник

🦄

🦄 in Go-go!
а в каком месте "главная горутина заблокируется"?
источник

RA

Ruslan Askme in Go-go!
ch1 <- 42
источник

🦄

🦄 in Go-go!
может я к вечеру совсем уже в глаза устал, но у меня там такой код
package main

import "fmt"

func main() {
 ch1 := make(chan int)
 go func(in chan int) {
   val := <-in
   fmt.Println("GO: get from chan", val)
   fmt.Println("GO: after read from chan")
 }(ch1)
 ch1 <- 42
 fmt.Println("MAIN: after put to chan")
 fmt.Scanln()
}
источник

F

Fenrir in Go-go!
это вроде не так работает
источник

RA

Ruslan Askme in Go-go!
извиняюсь, поправил сообщение выше
источник

RA

Ruslan Askme in Go-go!
а как тогда, объясните, пожалуйста
источник

F

Fenrir in Go-go!
если не ошибаюсь все будет выполнятся асинхронно
источник

l

lexx in Go-go!
а что хочется получить?
источник

F

Fenrir in Go-go!
в основном потоке го бросит 42 в канал и пойдет себе дальше
источник

RA

Ruslan Askme in Go-go!
я ожидаю, что всегда буду получать
GO: get from chan 42
GO: after read from chan
MAIN: after put to chan
источник

RA

Ruslan Askme in Go-go!
но как же, каналы вроде и нужны для того, чтобы общаться между горутинами. К тому же тут небуферезированный канал
источник

🦄

🦄 in Go-go!
главная горутина "заблокируется" только на  fmt.Scanln() и то достаточно условно, просто будет ждать ввода
а на этой строчке — она просто отправляет в канал, который принимает значение и в горутине его считывает

блокировку можно обеспечить продублировав запись, но так не надо, все умрет )

а вообще стандарт это wait groups
https://gobyexample.com/waitgroups
источник

F

Fenrir in Go-go!
именно
источник

🦄

🦄 in Go-go!
там же читатель есть в горутине, он из канала читает
источник

RA

Ruslan Askme in Go-go!
тогда по вашей логике, в выводе всегда первой строчкой должно быть MAIN: after put to chan, так ?
источник