Roman
а к го ближе всего си, просто потому что его разрабатывали матерые сишники
абсолютно неверно. У Go и C очень мало общего, а синтаксис он в любом языке хоть чуток да от C наследует
Andrei 🦉
Subbotin
Roman
ок, по каким критериям вы оцениваете, что питон ближе к го, чем си?
считай: GC vs no-GC Runtime (built-in) vs no-Runtime Goroutines vs Threads OOP vs no-OOP sync vs async programming разницы между Go и C - просто коллосальны.
Roman
однако Python я бы только для таких вещей как ML рассматривал бы когда нужно быстро склеить высокопроизводительные модули написанные на C++ в небольшую, экспрессивную логику. Я бы даже сказал что из-за его экспрессивности он в плане скриптинга лучше Go но он абсолютно не годится для всего остального учитывая его энерго-эффективность. На нём можно писать скрипты, но не алгоритмы и системы, он для этого слишком медленный и прожорливый.
Roman
но это такой, очень банальный и поверхностный анализ. Более глубокие анализов на 99.8% уверен в сети придостаточно
🍁 Jaŭhien
что такое алгоритмы и системы?
Roman
что такое алгоритмы и системы?
number crunching. вычисления. обработки большого колва одновременных клиентов. рендеринг... что угодно... для всего этого он вообще не годится
🍁 Jaŭhien
а, ну для числодробилок он не очень подходит, если не брать во внимание numpy
🍁 Jaŭhien
для всего остального - вполне
Roman
asyncio достаточно производительный, чтобы продолжать использовать питон в том же вебе, особенно там, где много бизнес логики
с Python та-же проблема что и с Node.js JavaScript. Да, нода сама по себе быстрая и с I/O справляется отлично поскольку построена на libuv (C++) event loop'е и V8 JS engine (достаточно мощный движок) Но проблемы возникают тогда, когда нам помимо I/O нужны вычисления. Какой-нибудь поиск по древу или фильтрация массива могут заблокировать event loop и всё нахрен встанет. JavaScript сам по себе не столь быстрый как Go даже с V8, но если ты ещё и блокируешь вычислением event loop то всё, ты проиграл.
Roman
с Go же у нас большое преимущество в том, что горутины не event loop, заблокировав горутину мы блокируем лишь 1 системный поток вычислением, все остальные продолжают работу.
Алексей
хотите числа дробить, то надо по любому брать достаточно низкоуровневые языки типа крестов
Roman
таки, в названии asyncio заложена суть библиотеки, она не для вычислений :)
поэтому я и уточняю, что до поры до времени Python/JavaScript могут держать нагрузку, но как только софт растёт и требует чуть большей логики - она сразу начинает перевешивать преимущества event loop'а по I/O и дико тормозить не используя потенциал многоядерного железа
Olzhas
Зачем на ноде бэкенд писать?
Daniel
на самом деле можно заблочить все потоки тред пула, так что го не решает эту проблему, а лишь смягчает её
каким образом можно заблочить все потоки динамически расширяемого тред-пула?
Roman
уже завезли треды, неактуальный аргумент про однопоточность
в системных потоках писать сложнее чем на горутинах, в этом и суть горутин. Никто не спорит что можно написать намного более оптимизированный поточный код аля Nginx на C или даже на worker'ах в JS, но сколько у тебя это займёт по времени и сколько съест нервишек? Go в этом плане почти идеален, он позволит тебе быстро написать асинхронный код в синхронном стиле, выполняя его не-блокирующе и используя все ресурсы системы, включая число-дробилки.
Pawel
мне лично проще для ML завести 20 интрпретаторов петона, которые к одной и тойже базе конектяца и выполняют один и тот же скрипт. Чем манаться с С++/java или с маргинальными биндингами на Go
Roman
уже завезли треды, неактуальный аргумент про однопоточность
плюс не забывай что Node.js воркеры это таки не потоки. Это воркеры. Разница в том, что они не делят меж собой память, что значительно ограничивает их возможности. Или я не прав про shared mem?
Roman
Зачем на ноде бэкенд писать?
чтобы не учить Go? 🙂
Daniel
он неограниченно расширяется?
коллега, давайте без херни, а? вы не знали, что он расширяемый - ок, теперь знаете. а болтать на тему "что будет, если я все же смогу вызвать одновременно более 10К сисколов, которые заблочат треды" я не хочу и вам не советую
Daniel
задайте этот вопрос гуглу, пожалуйста
Алексей
вот придётся
Roman
мне лично проще для ML завести 20 интрпретаторов петона, которые к одной и тойже базе конектяца и выполняют один и тот же скрипт. Чем манаться с С++/java или с маргинальными биндингами на Go
я собственно об этом и говорил. Это прекрасный скриптовой язык, медленный, прожорливый но экспрессивный, поэтому он не про systems/backend programming
Roman
коллега, давайте без херни, а? вы не знали, что он расширяемый - ок, теперь знаете. а болтать на тему "что будет, если я все же смогу вызвать одновременно более 10К сисколов, которые заблочат треды" я не хочу и вам не советую
у меня с webwire такая херня на винде происходит. Либо винда херня полная в плане TCP/IP, либо Go не очень оптимизирован на windows networking API (что вполне логично и можно бы было понять) https://github.com/qbeon/webwire-go/issues/17
Roman
я вот не проверял точно, но мне кажется, что память там можно расшарить через специальные объекты
често говоря тоже не совсем уверен, поэтому и спрашиваю так ли это или нет. Однако не могу себе представить что воркеры буду насколько-же производительны как потоки учитывая что у каждого воркера должен быть свой event loop они в теории должны быть супер-прожорливыми по памяти как минимум
Wingman
товарищи, кто go-pg юзает? как в нём правильно WhereIn использовать со слайсом интов?
Pawel
то же самое
Roman
Тем не менее, тонна бэкенда на пайтоне пишется. Возможно, всё не так уж и плохо :)
и причина тому меньший порог входа нежели Java, C++ и тому подобным а Go как-раз таки предоставляет для бэка совершенно новую альтернативу - с одной стороны достаточно быстрый, с другой стороны достаточно простой. Поэтому собственно PHP, Python и JS на бэкэнде теряют долю
Roman
Я вообще как-то скептически к потокам в ноде настроен, учитывая что там и V8 раньше даже и не мог даже новый интерпретатор в другом потоке создавать и ему нужен был отдельный процесс.
проблема в том, что мы пытаемся натянуть несовместимые модели программирования на языки, которые для этого изначально не были предназначены.
Roman
о чём Rob Pike собственно и говорил в 2015 на конференции, что многие ЯП напрасно стремятся к господству во всех сферах деятельности и что Go это нишевой ЯП by-design.
Daniel
именно у постгреса есть более эффективная конструкция, чем where id in (1,b,c,d,e...)
Wingman
pg.In() использовать, WHERE id IN(?)" , pg.In([]int{1,2})
да вот хрен код: if err = db.DB.Model(&vlansArr).WhereIn(`id IN (?)`, pg.In(vlanIDs)).Select(); err != nil { ошибка: ОШИБКА #22P02 неверное значение для целого числа: "{}" лог pg: FROM vlans AS "vlan" WHERE (id IN ('{}')) переменная точно не пустая: vlanIDS: []int64{0, 0, 0, 20633, 20640, 20603}
Daniel
А можно рассказать про расширяемость?
шедулер, если обнаруживает все треды заблокированными в сисколах, запускает дополнительные треды, чтоб горутинам было где исполняться
Alexandr
значит не юзай WhereIn, юзай плейсхолдер и то что я писал выше
Daniel
нет, конечно
Daniel
это же не блокировка
Daniel
тред работает
Алексей
ну то есть числа дробить надо аккуратно
Daniel
очень трудно написать такую дробилку, которая не вызывает шедулер
Алексей
можно легко написать дробилку, которая будет очень редко его вызывать
Daniel
не думаю. мне это удалось один раз за 4 года
Алексей
собственно если будет часто вызывать, то это уже будет довольно плохой дробилкой
Daniel
воткни в него Goshed :)
Алексей
точнее с плохой параллелизацией
Daniel
а что вы такое считаете?
Алексей
воткни в него Goshed :)
лучше кстати не втыкать, а повысить число тредов в пулле и запустить в нескольких горутинах вычисление
Алексей
чтобы в пулле были свободные треды
Roman
ну то есть числа дробить надо аккуратно
дело в том, что по сравнению с event loop'ом который блокируется вычислением полностью - горутина блокирует лишь один из системных потоков, не блокируя при этом весь процесс. Однако с правильным подходом к написанию можно обойти и эту проблему просто мануально переключая горутины в алгоритме
Алексей
а что вы такое считаете?
приходилось когда-то давно считать кое-какие показатели кое-каких случайных процессов траекторий случайных процессов приходилось генерировать очень много но я правда на крестах это писал
Алексей
и в принципе для таких числодробилок как раз считаю кресты наилучшим вариантом