🍁 Jaŭhien
VSC
Там плагин нужен какой-то?
Roman
Там плагин нужен какой-то?
https://code.visualstudio.com/docs/languages/go
Алексей
И вообще я всё веду к тому, что обычный многопоточный код не сильно сложнее кода на Го, он просто гораздо менее эффективный при нагрузках, только и всего.
Алексей
Roman
И вообще я всё веду к тому, что обычный многопоточный код не сильно сложнее кода на Го, он просто гораздо менее эффективный при нагрузках, только и всего.
что?!))) обычный многопоток на C++/Rust/Java может быть гораздо эффективнее Goroutine. Но писать его будет гораздо сложнее)) вы думаете green thread'ы зря чтоль придумали, если на простых потоках и без того легко писать?)))
Алексей
что?!))) обычный многопоток на C++/Rust/Java может быть гораздо эффективнее Goroutine. Но писать его будет гораздо сложнее)) вы думаете green thread'ы зря чтоль придумали, если на простых потоках и без того легко писать?)))
Я ещё раз повторяю. Можно спокойно написать многопоточный код, который будет практически совпадать с кодом на Го, просто он будет куда менее эффективным, потому что вместо горутин там будут обычные потоки.
Roman
Ещё раз напоминаю про libdill
green thread'ы в C, это таки не green thread'ы в констексте runtime'а языка
саша
shared mutable state без мьютексов говорите? что-то я вам не верю, коллега
С разморозкой https://ru.m.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%B0%D1%8F_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C
Roman
Алексей
обычные потоки менее эффективны горутин? с чего такое мнение?
Ну хотя бы с того, что для каждого потока выделяется полноценный стек, да и переключение между ними будет задействовать шедьюллер в ядре.
Roman
Ну хотя бы с того, что для каждого потока выделяется полноценный стек, да и переключение между ними будет задействовать шедьюллер в ядре.
вот я чёт сомневаюсь что горутины производительнее потоков в этом плане. Но это надо мерить, тут гадать не стоит.
саша
Да и там не все так просто
Алексей
вот я чёт сомневаюсь что горутины производительнее потоков в этом плане. Но это надо мерить, тут гадать не стоит.
ну при большом количестве явно эффективнее и производительней (иначе просто вместо них потоки бы юзали и не парились)
Roman
А это уже детали реализации
проблема в том что так или иначе mutable shared state требует синхронизации. Самая низкоуровневая примитива синхронизации это mutex, он в основе всех механизмов синхронизации. lock-free алгоритмы и структуры существуют, но не все проблемы решают, зависит от задачи. Порой mutex просто неизбежим
Алексей
мьютекс - не самый низкоуровневый
Roman
ну при большом количестве явно эффективнее и производительней (иначе просто вместо них потоки бы юзали и не парились)
вот и я о чём. горутины это про простое написание конкурентного приложения. в то время как для решение конкретных низкоуровневых задач thread pool'ы лучше
Алексей
а чем горутина так принципиально отличается от потока?
Алексей
а что тогда?
атомарные операции
Алексей
это по моему самое низкоуровневое из всех
Roman
а чем горутина так принципиально отличается от потока?
тем что она не поток а лишь абстракция над ним которая обходится тебе ценой user-space runtime scheduler'а и 4кб памяти?
Roman
атомарные операции
ну может быть ты и прав, да
Алексей
тем что она не поток а лишь абстракция над ним которая обходится тебе ценой user-space runtime scheduler'а и 4кб памяти?
именно это я и пытаюсь сказать, что работа с горутинами в принципе мало отличается от работы с потоками, потому что в принципе это почти одно и то же, за исключением производительности
Алексей
то есть можно в теории запилить реализацию го, в которой вместо горутин будут тупо потоки
Алексей
и никто особо не заметит разницы, пока этих потоков не станет слишком много
Roman
именно это я и пытаюсь сказать, что работа с горутинами в принципе мало отличается от работы с потоками, потому что в принципе это почти одно и то же, за исключением производительности
не стоит сравнивать системные потоки и горутины, это таки совершенно разные вещи горутина например не знает приоритета. А системный scheduler может приоризировать потоки
Алексей
мне почему то кажется, что можно изхитриться и сделать приоритеты для горутин
Roman
например представь себе игровой движок где у тебя рендеринг в горутине 0, физика в 1-10, а акторы AI в 10-10.000 проблема в том, что с scheduler'ом Go мы не сможем приоризировать горутину 0, хотя это было бы полезно чтобы не терять кадры в том случае, когда runtime больше занять вычислением AI..
Roman
с потоками можно приоризировать rendering thread дабы не терять кадры
Алексей
ну тут уже да, абстракция немножко протекает
Roman
мне почему то кажется, что можно изхитриться и сделать приоритеты для горутин
нет, никак, вообще никак, потому-что goroutine scheduler понятия не имеет какая из горутин важнее, ему плевать
Алексей
нет, никак, вообще никак, потому-что goroutine scheduler понятия не имеет какая из горутин важнее, ему плевать
но гипотетически можно влезть в код шедулера и сделать ему приоритеты
Алексей
типа потокам в пулле назначить разные приоритеты и мапить более приоритетные горутины на более приоритетные потоки
Алексей
(но так делать конечно же не надо)
Roman
можно сказать что goroutines это чисто коммунистическое общество гоферов. Где все гоферы равны, коллектив работает совместно над проблемами которые не приоритизируются государством (runtime)
Roman
но гипотетически можно влезть в код шедулера и сделать ему приоритеты
Гипотетически - да, практически - нет. У гугла нет планов встраивать приоритеты в Go scheduler ибо для таких вещей как коллективная обработка запросов API - она не нужна, а 3D движок на Go никто писать не будет. Однако я считаю можно бы конечно было и добавить, чтоб некоторые горутины намеренно планировались на приоризированных системных потоках или вообще запускались в своих отдельных.. было бы круто, но я не знаю какие этому могут быть последствия
Roman
нет, IPC это вам не shared memory, он дорого обойдётся как в плане написания кода так и в плане производительности
Evgeny
современные ОС меняют приоритеты потоков динамически, если поток computation bound - приоритет снижается, если он I/O bound - то повышается, чтобы сделать систему более отзывчивой
Evgeny
потоки на которых запускаются горутины - не исключение
Roman
потоки на которых запускаются горутины - не исключение
увы в выше приведённом примере в работе рендеринг горутины скорее всего будут помеxи из-за тысяч паралелльных AI actor горутин
Evgeny
что значит помехи?
Roman
Вообще-то нет. Те же двери на солярке дешевые
IPC всегда дороже и сложнее shared process memory
Evgeny
это будет работать так, поток ОС выполяет горутину, считающую какую-нибудь математику - ОС понизит динамический приоритет
Roman
что значит помехи?
потерянные кадры из-за того что выполняются AI акторы нежели rendering в нужное время
Evgeny
в реальных системах это не решается приоритетами, менять приоритеты потоков руками это практически всегда ошибка разработчика, исключения очень редки
Roman
IPC всегда дороже и сложнее shared process memory
Правильно сделанный ipc - нет. См solaris doors
Roman
Правильно сделанный ipc - нет. См solaris doors
без понятия о Solaris'е, я к нему даже никогда не прикасался
Evgeny
ты либо поставишь колом всю систему пользователя, либо у тебя какой-то поток не получит вовремя управление
Roman
Правильно сделанный ipc - нет. См solaris doors
однако наивно предположу что под словами "правильно сделанный" уже кроется сложность
Roman
Roman
однако наивно предположу что под словами "правильно сделанный" уже кроется сложность
Там просто и изящно: процесс экспортирует набор своих функций. Вызывающий код оказывается в контексте вызываемого процесса
Roman
процессе?) удачи в IPC)
Да в чем проблема с ipc? Что ж вы так его демонизируете?
Roman
если разные процессы то да, конечно
Roman
Да в чем проблема с ipc? Что ж вы так его демонизируете?
потому-что IPC на большинстве OS представляют собой многократные копии из контекстов туда сюда. Плюс сам код усложняется значительно, это вам не просто прочитать состояние переменной защищённой мьютексом
Roman
И никаких копий
Roman
Кольцо в shm
shared memory это весчь прикольная, но не кросс-платформенная
Roman
А где ее нет?
насколько мне известно на мобилках её нет совсем. А так она ещё и реализуется на разных системах совершенно по разному, там есть свои нюансы. Как-то очень давно занимался этой тематикой но уже забыл большинство деталей
Roman
надо разбираться. Факт в любом случае что кросс-платформенный бескопромиссный shared memory это вам не переменную прочитать/записать... это гораздо сложнее
Roman
Ну и копирование само по себе дешёвое
Roman
И оно становится заметным только на больших объемах
я просто текст
Перечитал и все ок
Alexandr
подскажите, плиз, как можно убрать одинаковые значения в двух слайсах(значения которые есть в обоих слайса). кроме как в циклах?