Slava
ещё раз
Slava
если у вас каналы для записи не буферезированные, то в селекте при попытке записи или чтения, если никто с другой стороны не читает/записывает, ваш селект будет заблокирован
Slava
в вашем примере, по логам видно, что 1) вы ждёте секунду до каждого тикера 2) ждёте 3 секунды до каждого така
Slava
что значит что селект блокируется
Andrey
вопрос был в том, что внутри select у нас два кейса, либо мы читаем из тикера (допустим, пока не читаем, время не настало), значит мы пишем в getChan, но так как он не буферизированный, то по смыслу каналов мы должны тут подвиснуть, пока кто-то не вычитает из него. Но, если я правильно понял, Go умеет определять читает ли кто-либо из канала, потому что блокировки на этом этапе не происходит. или я что-то не так понял?
если кратко. Вы не правильно поняли, Go не умеет определять, блокировка происходит.
Andrey
Причём блокировка это желаемое поведение. Если вам не нужна блокировка, то надо (даже с буферизованным каналом) варганить сбоку постоянного "читателя", который очищает канал.
heavycharged
Если внутри select ни один из кейсов не выполняется, но есть один кейс записи в канал (небуферизированный, из которого никто не читает), запись не происходит, select блокируется до наступления другого доступного case?
Andrey
сам селект не блокируется.
Andrey
ну то есть он блокируется, но только если все case заблокированы, а не один из них
heavycharged
Я думал так, например есть select, c двумя case:
1. чтение из канала
2. запись в канал (небуферизированный, из которого никто не читает)
если читать нечего, пишем в канал, если из канала никто не читает, то все, горутина зависла до тех пор, пока кто-то не прочитает из этого канала, и все другие case идут лесом. сейчас как-то тупо звучит, конечно, но минут 10 назад выглядело логично))
Andrey
чтоб понять это, поставьте log сообщения в перед и после селекта.
Andrey
если они будут постоянно писаться и между этими сообщениями ничего нет, то вы "проскочили" select. Если перед "после" есть пауза - то селект заблокирован
Slava
Я думал так, например есть select, c двумя case:
1. чтение из канала
2. запись в канал (небуферизированный, из которого никто не читает)
если читать нечего, пишем в канал, если из канала никто не читает, то все, горутина зависла до тех пор, пока кто-то не прочитает из этого канала, и все другие case идут лесом. сейчас как-то тупо звучит, конечно, но минут 10 назад выглядело логично))
в целом так и есть, никто не пишет, никто не читает - ждём
Andrey
select ждёт события на любом из case, и блокируется, если событий нет (произошла запись или чтение)
Andrey
можно сделать неблокирующий select, используя default
heavycharged
так получается, что Go умеет определять, если ли читатель из канала)) ведь он пишет в канал только в том случае, если него кто-то читает, а событие отправки в канал является первоочередным. или я опять что-то не так понял?
heavycharged
т.е. он определяет, выполнима ли операция отправки в канал, но она выполнима только в том случае, если либо канал буферизированный и буфер имеет пространство, либо есть читатель из канала
Andrey
у select'а нет приоритетов, вы можете case'ы тасовать как угодно, от этого поведение не меняется
heavycharged
не, я понимаю что там рандом
Andrey
воспринимайте select как много параллельных команд. Сначала вы параллельно запускаете все чтения и записи, которые у вас есть в case'ах. Потом, последней командой, ждётё события на любом из каналов.
heavycharged
Не сочтите за наглость, но можно попросить вас отвечать на ворпосы да или нет, так я быстрее пойму и не буду отнимать ваше время? :)
Andrey
да
Andrey
:)
heavycharged
В обычном случае, если мы из горутины отправим в небуферизированный канал из которого никто не читает, то она зависнет на операции отправке в канал, верно?
Andrey
да
heavycharged
В случае с select, если ни один из кейсов не может быть выполнен (нечего читать), но есть один кейс, в котором происходит запись в канал (опять же, небуферизированный, из которого никто не читает), то сама запись не производится, верно?
Andrey
не производится
Andrey
вы зря запись от чтения отделяете. механизмы блокировки одинаковы. Воспринимайте case как операцию с каналом, не важно, чтение это или запись.
heavycharged
Получается, что Go определяет возможность выполнения case, а если канал небуферизированный, то возможность выполнения case может быть только тогда, когда есть читатель. Тогда, получается, Gо знает и умеет определять, есть ли читатель на другом конце канала? Если есть - то отправляем, а нет - значит сидим внутри select и блокируемся (ждем, пока хотя бы один case станет выполним)
heavycharged
т.е., допустим мы вышли из select, зашли на следующую итерацию цикла, вошли в select, ни один из case не выполним, и тут бац, появляется читатель на канале, тогда выполняется case с отправкой в канал.
heavycharged
внутри select немножко другое поведение получается при отправке в канал, если я правильно все понял из дискуссии. отправим мы только в том случае, когда кто-то будет читать оттуда.
Andrey
> Gо знает и умеет определять, есть ли читатель на другом конце канала
Внутри любой программы на Go, помимо вашего кода есть runtime. Он работает постоянно, и если находит пару читатель/писатель с одним каналом, он их разблокирует.
heavycharged
heavycharged
да, теперь я понял, спасибо за пояснения @gorilych и @m0sth8
Andrey
с select есть специфика, которую я и сам не до конца понимаю. Вот если есть два case с одним каналов, один на чтение, другой на запись - оно всё равно блокируется
Andrey
https://play.golang.org/p/k7m0B37b83x
heavycharged
а помоему тут все логично
heavycharged
хотя вы меня пару минут назад учили и объясняли мне, все же вырожу свою мысль)))
heavycharged
если следовать логике, то внутри select есть два состояния, первый это заблокированный, значит что ни один из кейсов не выполним, второй - в работе, значит что хотя бы один case выполним.
в данном случае, ни один из кейсов не выполним, потому что запись не может быть выполнена (никто не читает), а чтение не может быть выполнено (никто не записывает)
Andrey
в моём понимании, select на каждый case порождает горутину, и они выполняются _параллельно_
heavycharged
а если мы добавим буфер, тогда операция записи становится возможна (канал же с буфером), и, следовательно, операция чтения будет возможна (в канале уже что-то будет)
Slava
🎉
Slava
соответственно в вашем примере, каждый раз либо не будет никто ещё читать, либо никто ещё не записал
Slava
последовательно, но рандомизируя список каждый раз
🎉
Slava
Andrey
так?
heavycharged
ночь знаний)))
Andrey
короче, надо читать https://golang.org/src/runtime/select.go
🎉
нет
Вот видос просто видел https://www.youtube.com/watch?v=uO268voCGwA
Andrey
чтобы понимать код на go, надо читать код на go. Однако, рекурсия
🎉
Если бы я рулил этой конторой, то посмотрев на экономию, я бы бежал от пыхи сломя голову.
Andrey
экономию в чём? Сколько будет стоить переучить толпу php разработчиков на go и переписать Zend на go?
🎉
Мда.))
🎉
Пили, ели, веселились, протрезвели, акуели.
heavycharged
под каждую задачу - свой инструмент.
Andrey
не надо бежать сломя голову, а то и правда сломать можно :)
Andrey
там у них была маленькая задача, которую (как оказалось после анализа), можно заменить.
🎉
Недавно доклад смотрел, люди понимали что рано или поздно упрутся в стену, и переписали на го, пришлось переучиваться правда, но профит на лицо.
🎉
https://www.youtube.com/watch?v=HoEn7lXNQOU а вот оно.
Pawel
Pawel
Pawel
на флагах исследователей и специалистов решающих задачи ML.
основа всех сетей бекпропогейшен -это последовательный алгоритм. А весь препроцессинг который делает питон это фактически Си и обертки.
cuda, которую Гоша не поддерживает
И главное то, что никто не будет учить синтаксис и заморачиваться с беднейшей стандартной библиотекой. Но и как бы в ML не программисты...
Вообще это все бред, о чем речь? Go в машинном обучении нет, в данном случае не рассматривается вообще, это все равно что говорить о lisp в ML. до тех пор пока хотя бы на kaggle не начнут решать задачи на Go и не покажут хоть сколько нибудь значимый результат.
p.s. к слову по поводу вчерашнего обсуждения - пообщался с парой людей в теме, и нифига... бизнес (например потребительская электроника, еда, фешен) по прежнему использует простейшую логрег и DL пока очень далек от реальности, разве что в зрении и речи уже активно используются сети чаще.
на флагах исследователей и специалистов решающих задачи ML.
ахаха))
основа всех сетей бекпропогейшен -это последовательный алгоритм
да, я вижу вы глубоко в теме.
cuda, которую Гоша не поддерживает
при чём тут вычисления на видеокартах Nvidia? вы что, не трезвый?
И главное то, что никто не будет учить синтаксис и заморачиваться с беднейшей стандартной библиотекой. Но и как бы в ML не программисты...
штааа???
Вообще это все бред
это точно
Go в машинном обучении нет, в данном случае не рассматривается вообще, это все равно что говорить о lisp в ML
а кто говорит про это и что это такое вообще?
бизнес (например потребительская электроника, еда, фешен) по прежнему использует простейшую логрег и DL
это к чему?
Artem
на флагах исследователей и специалистов решающих задачи ML.
ахаха))
основа всех сетей бекпропогейшен -это последовательный алгоритм
да, я вижу вы глубоко в теме.
cuda, которую Гоша не поддерживает
при чём тут вычисления на видеокартах Nvidia? вы что, не трезвый?
И главное то, что никто не будет учить синтаксис и заморачиваться с беднейшей стандартной библиотекой. Но и как бы в ML не программисты...
штааа???
Вообще это все бред
это точно
Go в машинном обучении нет, в данном случае не рассматривается вообще, это все равно что говорить о lisp в ML
а кто говорит про это и что это такое вообще?
бизнес (например потребительская электроника, еда, фешен) по прежнему использует простейшую логрег и DL
это к чему?
о чем речь вообще? вы уж простите но несете какую то ересь... выражения типа шта... че... ахаха -это детский сад и клоунада откровенная. О чем речь и в чем ваш вопрос? Если есть хоть какой то аргумент, кроме питон гавно и в ML хипстеры я готов послушать. Лучше, если вы хоть раз решали хоть одну задачу похожую и понимаете о чем речь, поскольку пока этот лигбез меня утомил :)
Текст о бизнесе был в контексте вчерашнего обсуждения о том. что я "устарел" и ритейл с маркетингом используют нейронные сетки -уточнил, это бред, все используют логистическую регрессию и никакого дл там нет и в помине. Просто лень искать обсуждение и потому в общей простыне буквы поместил.
Pawel
"вы уж простите но несете какую то ересь..." - какую именно? я ничего и не утверждаю
"О чем речь и в чем ваш вопрос?" - вопрос - на кой хрен вы тут вспомнили библиотеку для вычислений на видюхах? вопрос - Что вы имели ввиду в ваших высказываниях выделенных курсивом? они похожи на бессвязное словоизвержение под веществами. При чём тут ликбез?
у меня не было аргумента "питон гавно", про ML я вообще не слова не сказал.
Artem
Alexey
Коллеги, пожалуйста, снизьте градус :)
Pawel
"вы хотели использовать конкурентность Го, которая никому не нужна." - кому не нужна? здесь в чятике все кто программирует на Го её используют и довольны
"Задействовать какие то ядра, когда все задачи решаются на GPU. " - так это чистая незамутнённая шизофрения. Использовать GPU и не использовать при жтом ядра основного проца - это абсолютно клинический случай.
"О чем речь вообще? Все ваши слова может понадобится... Полезна, не критична -это о чем вообще? Кому это нужно?" - у вас каша в голове, вы не можете держать в голове более трёх простых связанных мыслей? Я напомню:
вычисления на процессоре ни о чем вообще (и на 10 и 100 процессорах).
Алгоритмы используемые в ML сегодня не паралелятся в большинстве.
это пример того, что требует пояснений. Впрочем уже не требует, для меня с вами всё ясно.
Alexey
Словами «с вами всё ясно»? Серьёзно?
Pawel
количество попытко ограничено, предел терпения достигнут, пора подводить итог "дискуссии"
Artem
"вы хотели использовать конкурентность Го, которая никому не нужна." - кому не нужна? здесь в чятике все кто программирует на Го её используют и довольны
"Задействовать какие то ядра, когда все задачи решаются на GPU. " - так это чистая незамутнённая шизофрения. Использовать GPU и не использовать при жтом ядра основного проца - это абсолютно клинический случай.
"О чем речь вообще? Все ваши слова может понадобится... Полезна, не критична -это о чем вообще? Кому это нужно?" - у вас каша в голове, вы не можете держать в голове более трёх простых связанных мыслей? Я напомню:
вычисления на процессоре ни о чем вообще (и на 10 и 100 процессорах).
Алгоритмы используемые в ML сегодня не паралелятся в большинстве.
это пример того, что требует пояснений. Впрочем уже не требует, для меня с вами всё ясно.
возможно вам сложно это понять по все ядра итак задействуются фреймворком.
здесь в чатике возможно и довольны конкурентностью Го, вот только я ниразу не слышал такой потребности от того, кто занимается data science.
Напоминать не нужно, это лишь одна цитата, ваших шта было больше.Вы несете чушь еще раз. И повторю последний нет потребности в задействовании возможностей, которые есть у Go и спецефичны для него. Просто нет таких проблем а те проблемы которые есть Go решать просто не умеет и более того не умеет того, что все используют сегодня
Alexey
Мне кажется, что уровень дискуссии определяют все участники. Любой может его поднять, не используя подходы «в интернете кто-то не прав, сейчас я его, суку, размажу» и «да что с ним говорить, дебил конченный». Уважать собеседника (живого человека) и его мнение совсем не сложно, и часто можно чему-то научиться. Используя слова типа «чушь ещё раз» ничему научиться нельзя, только самоутвердиться, что в интернетах довольно бессмысленно