.
https://rakyll.org/scheduler/
.
И там принцип работы обьясняется как то по другому
Cat
https://rakyll.org/scheduler/
> There are at most GOMAXPROCS spinning Ms at any time
.
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
В доке по GOMAXPROCS GOMAXPROCS sets the maximum number of CPUs that can be executing simultaneously and returns the previous 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
это следующее предложение
.
Это все еще касается логических процессоров
.
Не потоков ОС
.
Разве нет?
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 ноде
Roman
Это все еще касается логических процессоров
Что такое "логический процессор" в вашем случае?
Roman
logical CPU
Что это?
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 потоков на ядро?
.
Почему в документации говорится о двух разных вещах?
.
А если у нас ht? А если cpu умеет до 8 потоков на ядро?
количество физических ядер * количество потоков на ядро
Slava
есть такое понятие, абстракции
.
Мне просто непонятно почему эти две вещи преподносят как взаимозаменяющиеся понятия в таком случае
Slava
они тут прямым текстом говорят количество ядер, которые будут занятые одновременно выполнением кода
Slava
а так как вы не можете выполнять один тред на двух разных cpu одновременно - то это равно количеству тредов одновременно выполняющих код вашего приложения
Slava
само количество тредов может быть и больше, какие-то заблокированы на сисколах, какие-то отрабатывают с++ код, какие-то сборщик мусора
Roman
Мне просто непонятно почему эти две вещи преподносят как взаимозаменяющиеся понятия в таком случае
Да все же просто: есть динамический пул потоков, который используется для сисколлов. Есть пул потоков, в котором исполняются горутины. Вот размер этого пула задаёт gomaxprocs
.
Окей, понятно
.
Спасибо большое за ответы @pragus @m0sth8
Slava
всегда рады помочь
Me
Парни, есть net.Dial Как правильно сделать, переустановку TCP сессии в случае её обрыва?
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
крутые дефолтные значения
Roman
крутые дефолтные значения
См "механизм контролёров"
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
Лучший язык программирования ever