.
https://rakyll.org/scheduler/
.
И там принцип работы обьясняется как то по другому
.
P имеет другой смысл в цепочке G-M-P
.
Меня совсем запутала эта картинка
.
.
И где то говорится что GOMAXPROCS отвечает за количество логических процессоров, где то - за количество тредов ОС
.
Например, в статье выше
https://dave.cheney.net/tag/gomaxprocs
GOMAXPROCS is the well known (and cargo culted via its runtime.GOMAXPROCS counterpart), value that controls the number of operating system threads allocated to goroutines in your program.
Slava
ну, так и написано, количество тредов - которые заняты вполнением горутин
.
Да, тредов
Slava
сколько там реально тредов будет работать - кто его знает
.
В доке по GOMAXPROCS
GOMAXPROCS sets the maximum number of CPUs that can be executing simultaneously and returns the previous setting.
Slava
что непонятно то в итоге?
Cat
у него лок на processors vs threads
.
.
Slava
Slava
это следующее предложение
.
Это все еще касается логических процессоров
.
Не потоков ОС
.
Разве нет?
Slava
нет, в той же документации по го, где про логические cpu
Slava
The GOMAXPROCS variable limits the number of operating system threads that can execute user-level Go code simultaneously. There is no limit to the number of threads that can be blocked in system calls on behalf of Go code; those do not count against the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes the limit.
.
Странно почему конкретно в описании функции говорится чуточку о другом
Slava
логические cpu тут потому, что программе не всегда дано использовать все физические cpu, к примеру если она работает на определённой numa ноде
Slava
.
Roman
Cat
lmgtfy
.
грубо говоря, одно ядро
.
Если нет HT
.
с чего вы взяли что о другом?
1.GOMAXPROCS sets the maximum number of CPUs
2. GOMAXPROCS variable limits the number of operating system threads
.
Мне эти два понятия не кажутся одним и тем же 😕
Slava
ну, это скорее ваша проблема, чем языка Go
Slava
вы берёте из целого абзаца пол предложения и пытаетесь этим оперировать
Slava
так нельзя
.
Окей, берем целое
.
GOMAXPROCS sets the maximum number of CPUs that can be executing simultaneously and returns the previous setting. If n < 1, it does not change the current setting. The number of logical CPUs on the local machine can be queried with NumCPU. This call will go away when the scheduler improves.
.
Что поменялось? Где тут говорится про потоки ОС?
Slava
а зачем говорить об этом тут, если о тредах сказано на несколько абзацев выше в той же документации?
.
Потому что это в документации, нет?
Roman
Если нет HT
А если у нас ht? А если cpu умеет до 8 потоков на ядро?
.
Почему в документации говорится о двух разных вещах?
Slava
есть такое понятие, абстракции
.
.
Мне просто непонятно почему эти две вещи преподносят как взаимозаменяющиеся понятия в таком случае
Slava
они тут прямым текстом говорят количество ядер, которые будут занятые одновременно выполнением кода
Slava
а так как вы не можете выполнять один тред на двух разных cpu одновременно - то это равно количеству тредов одновременно выполняющих код вашего приложения
Slava
само количество тредов может быть и больше, какие-то заблокированы на сисколах, какие-то отрабатывают с++ код, какие-то сборщик мусора
.
Окей, понятно
.
Спасибо большое за ответы @pragus @m0sth8
Slava
всегда рады помочь
Me
Парни, есть net.Dial
Как правильно сделать, переустановку TCP сессии в случае её обрыва?
Roman
Dmitriy 😎
Видимо, в способе понять, что произошел обрыв.
Me
А в чем сложность?
Ну например в этом
func Open(addr string) (*bufio.ReadWriter, error) {
log.Println("Dial " + addr)
conn, err := net.Dial("tcp", addr)
if err != nil {
return nil, errors.Wrap(err, "Dialing "+addr+" failed")
}
return bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)), nil
}
Если TCP сессия рухнула как переустановить сессию?
Me
Гуглил, но так и не нашёл ответа
Me
Может как-то через каналы
Dmitriy 😎
У меня была такая же проблема. Вроде бы советуют прочитать срез []byte нулевого размера, если вернулась ошибка – значит обрыв
Me
Dmitriy 😎
Я переустанавливал новое соединение
Me
Эм...
Me
А стары объект дропался?
Dmitriy 😎
Да
Dmitriy 😎
Можно написать обертку
Dmitriy 😎
В которой бы была проверка, что соединение живое
Dmitriy 😎
Либо, в асинхронном потоке проверять соединение периодически, раз в 10 секунд, например
Dmitriy 😎
И устанавливать новое, если оно мертвое
Me
Keepalive не спасёт?
Roman
Keepalive не спасёт?
Он предназначен для проверки что соединение живо. И с дефолтными настройками ты об этом узнаешь где-то через 2ч, 11минут и 15 секунд
Me
крутые дефолтные значения
Me
Вдруг кому пригодится
func ToProd(ch <-chan string) {
var c net.Conn
var err error
connect := func() {
// Establish connection with remote host
for {
c, err = net.Dial("tcp", "snmp:80")
if err == nil {
break
}
// report about incidnet and sleep a bit
log.Printf("Error: %v\n", err)
time.Sleep(time.Second)
}
}
connect()
log.Println("Session with PROD established")
writer := bufio.NewReadWriter(bufio.NewReader(c), bufio.NewWriter(c))
// wait for messages from channel
for {
msg := <-ch
success, err := writer.WriteString(msg)
if err != nil {
c.Close()
log.Printf("Can not send data to prod, %v", err)
connect()
}
err = writer.Flush()
if err == nil {
log.Printf("Successfully wrote %v messages to prod server\n", success)
}
}
}
abcd
Посоветуйте статьи/литературу по устройству веба и т.п?
Olzhas
Olzhas
Лучший язык программирования ever