Roman
теооия
Roman
потому и спросил
Daniel
тогда не надо этим заниматься
Daniel
смысла 0
Cat
а как это может произойти? тред-то заблочен. можно снять с него горутину, но зачем?
ну например, если мы сделаем 2 рутины, крутящиеся в цикле, и поставим GOMAXPROCS=1, то будет выполняться только одна
Cat
а если добавим в неё fmt.Println (т.е. сискол), то скедулер переключится на вторую
Cat
с GOMAXPROCS=1?
Daniel
ага
Roman
еще это иеет значение такое: стоит ли делать сильносвязанные горутины небуферизированными каналами, и если да, то до какого предела и какие последствия будут для остальных горутин, если мы имеем например всего 4 ядра (для примера)
Cat
ага
да ладно?
Daniel
ага
Daniel
колом программе встать никто не позволит
Cat
подожди
Cat
так речь не про это, а про контекст свитч как таковой
Vladislav
https://morsmachine.dk/go-scheduler
Vladislav
Судя по этой штуке шедулер может отдельный поток под сискол поднять.
Cat
да он просто системе отдаст и всё, не? UPD: не.
Cat
> The syscalling thread will hold on to the goroutine that made the syscall since it's technically still executing, albeit blocked in the OS.
Cat
в общем, обожаю горутины
Roman
так вот - горутина, заблокировавшаяся на сисколе (вместе с тредом) - она исполняется с точки зрения шедулера.
перед вызовом сисколов есть какой то код, который горутину кладет в очередь к P и снимант ее с M, разве нет?
Slava
Не всегда
Roman
там даже для cgo что то такое есть
Roman
я по диагонали смотрел, могу ошибиться
Slava
Если на каждый маленький сискол переключаться, можно и не успеть всё сделать
Roman
смысла 0
еще вот сценарий зависона может быть: связываем две горутины небуф. каналом, одна пишет, вторая читает, далее обе делают что то без возможности скинуть в очередь, например, что то считают. тогда если у нас gomaxprocs=2, два ядра, и две машины, то эти обе горутины будут исполняться одновременно, олна на M1, вторая на M2, и все залочится. это реально?
Slava
Как это
Slava
Одновременно и с каналом работать и считать?
Roman
это если теория верна
Roman
что две горутины - читающая и пишущая, для успешного продолдения рабоиы обязаны одновременно быть на двух разных машинах
Slava
Нельзя же одновременно в канал писать/читать и считать
Slava
В рамках одной горутины
Slava
Не относится к вопросу, но в го одна горутина может писать напрямую в стек другой, если та ждет на чтении из канала
Slava
Кажется это единственное место такое
Alexander
Недавно начал писать на го! Написал своеобразное апи для одного сервиса. Сейчас хочу написать апи для одного сайта (только апи, фронтенд будет на js'е) Хочется подойти более-менее основательно, поэтому хотел бы попросить совета какие инструменты лучше использовать, чтобы минимизировать написание кода для всяких шаблонных вещей типа структур таблиц в БД, структур для json'а и прочих вещей. Пока идеологически планируется примерно следующая архитектура - есть точка входа (возможно несколько, но пока будет использоваться одна). В зависимости от переданных данных запрос перенаправляется в один из модулей через gRPC (тут тоже хотелось бы какую-то подсказку, примеры по использованию, желательно в рамках какой-нибудь IDE - я использую goland от jetbrains). В большинстве своём интересуют вопросы связанные с приспособлениями для работы с gRPC, генерации структур по таблицам БД и json, и возможно по работе с easyjson (пытался сгенерить с помощью него структуры, но тоже как-то неудачно, а говорят производительности он неплохо прибавляет по сравнению со встроенным)
Slava
Keep it simple
Slava
Начинай с простых вещей, со стандартной библиотеки
Slava
Пусть даже код будет более talkative
Slava
Всё равно перепишешь ещё раз пять
Alexander
ну я написал достаточно большое апи, порядка 4-5 тысяч строк и именно базовые вещи, да и +- как работает всё понятно интересно именно разобраться как 1)правильно писать такие апи (слышал что можно описывать апи в некотором формате, а на его основе будет генериться серверная часть и допустим клиентская) 2)как работать с grpc (хотелось бы какие-то практические примеры использования в ide) 3)со структурами понятно -просто уменьшение времени написания шаблонного кода 4)ну easyjson вишенка на торте, но етсь подозрения, что ключик к нему там же где и к grpc
Slava
Если у вас grpc, то вы апи описываете в протобафе
Slava
Это мало связано с ide
ᗷᗩᒪEᑎᑕIᗩGᗩ
Привет ребята , кто может автобота создать в телеге ?
ᗷᗩᒪEᑎᑕIᗩGᗩ
мегатрон?)
В телеге который продаёт
Mikhail
В телеге который продаёт
бюджет 100 рублей?)
Anton
Я б за такое бан дал
Mikhail
Я б за такое бан дал
надеюсь не мне)
კაცი
надеюсь не мне)
И тебе за компанию
Anton
надеюсь не мне)
Точно не тебе) она аналогичное спросила и в пайтон чате
Anton
И тебе за компанию
Поздороваемся?
Anton
Alexander
Привет, недавно начал изучать го Появилась задача - разобрать массив со значениями в несколько потоков (разумеется так чтобы не смотреть значение которое уже забрали из массива), это нужно реализовать через каналы или еще как-то? пока просто не совсем понимаю
Alexander
тоесть заполнить канал элементами из массива кроме как циклом или горутиной - нет?
Alexander
elements := make(chan string) for _, elem := range list { elements <- elem } что-то вроде такого чтобы заполнить канал элементами, правильно?
Vasilii
Канал не структура чтобы его заполнять
Vasilii
Запись в канал будет висеть пока другая горутина не запросит эти данные
саша
func product(channel chan string, arr []string) { for _, elem := range arr { channel <- elem } } func consume(channel chan string) { for { str := <- channel print(str) } } ... elements := make(chan string) go product(elements, someArray) for i = 0; i < 10; i++ { go consume(elements) } Как-то так, только без утечки
саша
Ну и конечно это не скомпилируется, ибо синтаксические ошибки
саша
Можно считать это псевдокодом
Alexander
Спасибо, пойду проверять, по первому впечатлению - вроде понял =)
Roman
кстати, бот-продаван, хорошая идея, впилю в свой проектик fileshare
ᗷᗩᒪEᑎᑕIᗩGᗩ
кстати, бот-продаван, хорошая идея, впилю в свой проектик fileshare
Может мне заодно сделаете лёгенький ?☺️👌
Roman
не, не сделаю
Anonymous
нет там никакой машины
С колесами нет, а как "M - worker thread, or machine" в runtime/proc.go есть. Вероятно, мэйнтейнеры Go идиоты
Anonymous
кто знает, как в echo фреймворке добавить ф-ции в шаблонизатор?
⏺ Vаdim
Anonymous
ну например гошный шаблонизатор не умеет даже +1, я хочу индексы вывести в человеческом виде 1..max а не 0..
Roman
что две горутины - читающая и пишущая, для успешного продолдения рабоиы обязаны одновременно быть на двух разных машинах
почитал chan.go. там все как раз наоборот. ожидание чтения из канала гарантирует отсутствие G1 в очередях. запись в канал проверяет, что читатели точно неактивны. после этого, в стэк пишущей горутины кладется значение, деактивируется горутина и выкидывается из очереди, а читающая горутина вставляется в конец очереди того же самого P (либо в глобальную очередь, если тут нет места). читающая горутина гарантированно продолжает работать только тогда, когда пишущая уже выкинута из машины. после чтения, пишущая горутина возвращается в очередь этого же P. таким образом гарантируется разрешение всяких коллизий.
Roman
читабщая горутина забирает значение из стэка пишущей
Roman
а не наоборот, как тут писали
Roman
именно для этого гарантируется отключение конкурирующих за канал горутин
Anonymous
👍
Daniel
С колесами нет, а как "M - worker thread, or machine" в runtime/proc.go есть. Вероятно, мэйнтейнеры Go идиоты
вероятно, использовать надо общепринятые термины, даже если у них есть редкоупотребимые синонимы. а идиот тот, кто с этим спорит...