- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
function* foo2() {
yield 2;
yield 3;
}
function* foo() {
yield 1;
yield* foo2();
yield 4;
}
function main() {
for (const o of foo()) {
print(o);
}
print("done.");
}
https://learn.javascript.ru/generators
И нахуя это? У меня в контроллере такой хуйни нет, и я не очень-то понимаю, нахуя это надо. Но намакроебить можно, да
Задачки в духе "собери 1000 семплов с АЦП, зожми их и отправь по UDP" и без корутин норм смотрятся. А для чего-то более сложного и длинного можно и тред поднять, контроллеру не надо обрабатывать тыщи клиентов.
З.Ы. Я сварщица не настоящая, возможно j123123 приведёт реальные примеры задач, где корутины ему бы помогли.
Это конечно может и т.н. "парадокс Блаба", но надо бы придумать и "парадокс антиБлаба", когда какую-то хуйню, типа вот какой-то малозначительный синтаксиальный сахарок привозносят как какую-то мегаохуенную фичу, из-за которого всем резко надо валить на этот принципиально новый ЯП.
Не, ну это логично. Просто сахарок для стейтмашины или файбера (смотря какая реализация).
> Rust и парадокс Блаба
> Будучи руководителем проектов по языкам в Microsoft, я работаю над TypeScript – типизированной версией Javascript. В обязательном порядке, когда я выступаю перед аудиторией преимущественно JavaScript разработчиков и пытаюсь донести мысль о том, как здорово было бы попробовать добавить немного строгой типизации в Javascript, на меня смотрят хмурые лица. Всякий раз. Даже если она не обязательна. Даже после того как я опишу полдюжины преимуществ. Как и говорил Пол, это выглядит просто «странно». Для JavaScript-программистов TypeScript выглядит в основном тем же что и JavaScript, плюс куча стремной и непонятной фигни.
Кстати, где ещё применялся ActionScript? В AIR, про который знало полтора человека?
https://www.oreilly.com/library/view/flex-3-cookbook/9780596529857/ch01.html
Сразу ясно, что в btn может лежать только объект типа Button, а не число, не строка, не массив.
Почему он уступил место тупому JS?
В айти всегда побеждает самое тупое тормозное неудобное решение, требующее максимальаное количество ручных проверок
Один макак-гавноед из Сана насрал, а тыщи макаков скопировали
Тупее только "->" в пхп
Но вообще согласен, в крестах и в Object Pascal (в старой модели object, не в новой дельфёвой class) объекты можно было создавать в глобальной области, на стеке и в куче. В первых двух случаях алло-катор звать не нужно. В этих случаях конь-структор вызывается спецсинтаксисом (C++) или по имени (Object Pascal, да, в нём можно иметь несколько конь-структоров с разными именами).
-> в ПХП после крестов выглядит тупо, ибо там не надо ничего разыменовывать, но точку взять было нельзя, ибо она уже занята под конь-катенацию (культ Перла). Пришлось брать что-то другое и, недолго думая, взяли ->
да, но зачем этому отдельное ключслово?
А вот в ObjC есть два отдельных метода: `alloc` и `init`, и еще звездочка у типа, хотя и ежу ясно, что это указатель.
>культ Перла
У перла всё таки нету отличия строки от числа на уровне типов (и то и то скаляр), а в пыхе есть. И стрелочка в перле тоже есть, но только лишь потому, что там есть понятие указателя. Это чуть-ли не единственный скриптоязык, где понятие "указатиель" настолько базовое, что без него просто массив в функцию не передашь.
ОБЫ́ЧНО, нареч.
Нареч. к обычный.
1. Жизнь в приемной протекала обычно. Секретарша ставила сургучные печати на пакет, посетители ожидали своей очереди. С. Антонов, Анкета.
2. Большей частью, постоянно, как правило. Днем он обычно спит. К вечеру оживляется. В. Кожевников, Бессонница. Гордей Андреевич со стиснутыми зубами метался в постели. Обычно терпеливый, --- на этот раз он изменил себе. Игишев, Шахтеры.
приведи реальный пример, когда new в obj c необычный, т.е., не является сочетанием alloc + init
https://developer.apple.com/documentation/objectivec/nsobject/1571948-new
«Оригинал»: подвижные брови, миндалевидные глаза, обаятельные складки под глазами. Умер или уничтожен за кулисами публичного шоу в конце девяностых.
кто-то флексит
При том что она очень чисто заворачивается реализуется Сишным свитчом и заворачивается в макрос.
Да не, не думаю...
Корутины -- это довольно нишевая хуй-ня: когда длинный алгоритм должен ждать каких-то ответов в куче точек, но при этом его нельзя взять и закинуть в тред (к примеру, потому что разрабы языка побоялсь давать обезьяне гранату или потому что вся прога будет состоять из этих закидываний в тред).
Реально это можно сделать несколькими способами: функционушнёй, тем же паттерном «Итератор», а можно нагородить елдак.
Доказано node.js
Нормальную вытесняющую многозадачность с помощью CPS сделать трудно, поэтому она сделана на уровне рантайма.
* JIT очень простой, и он переиспользует регистры VM, поэтому его можно особо не рассматривать.
А регистры у VM ограничены, или их стописот как у llvm?
Вот рекурсивный обход каких-то сложных и нерегулярных структур -- более менее реальный пример, когда мне реально хочется юзать генератор.
у нас в коко уже нет
Через корутины реализованы реактивные потоки (а-ля rxjs), аналоги акторов, и просто разные задачи, которые нужно делать параллельно, и при этом стопать их скопом или джойниться скором (g structural concurrency)
Треды нужны чтобы загрузить CPU. Делать 1000 тредов просто ради удобства обезъяны -- неудобно
Колбеками пусть мои враги пользуются и едят лапшу
Асинхронная питушня решает часть задач, но не все (ленивость и та же структурная конкранеси ей не подвласна)
Ещё раз отвечу. Идея отличная. Люди пишут на ЯВУ с кучей синтаксического блоата вроде c++/жабы/c#/ecma6, которые создают им больше проблем чем должны решать.
Возможно это тот случай когда
Антиблаболки считают «сахарок» важной, необходимой фичей.
Но в силу анскильности не понимают что их фича — всего-лишь частный случай какой-то более общей концепции.
Которая вполне реализуема в более простом языке.
чур не срать тыщу потоков и без ебли с еполоами и комплишен портами
Эм, а что мне мешает захуйнуть 10к пакетов в сокеты и проспать оставшееся время?
и сделать это с 10К сокетами
Не, ну технически может получиться интервал чуть меньше 3с между отправками в один сокет. Это критично, надо прям гарантию что при лагах процесора можно больше 3с, но меньше -- никогда?
а можно не меньше 3с?
ну желательно не больше десяти
ах да, чуть не забыл: для одного из сокетов будет 8ск
Я тупо возьму priority queue с сортировкой по времени и буду спать до head'а, а потом отправлять тех, чьё время пришло.
И хуй ты этот код побьёшь по пирфомансу своими корутинами.
А уж если мне придется одну из этих отправок кенсельнуть, то и вовсе придется петушить твою очередь
В котлине корутины на тредпуле что ли крутятся, как в asio, зависание одной из них не лочит остальные?
Работа с сетью идет через пакет ktor, а он использует под капотом асинхронные сокеты
Если ты не трогаешь в корутинах блокирующие операции типа обычных сокетов или IO файлов, то остальные и не лочатся
Ну т.е. компайлтайм гарантий никаких нету? Тогда нечестно писать "если одна отправка воткнёт", у тебя ситуация ничем не отличается.
Вы просто не зовите блокирующие функции и ничего не заблокируется.
Но это задача для докторов компьютерных наук, а не для обычных жабоёбов
>нечестно
почему?
У тебя буфер заполнится, и отправка встанет.
А в случае асинхронности тебя верно вежливо попросят EAGAIN или как-то так
>Вы просто не зовите блокирующие функции и ничего не заблокируется.
Борманд, ну разумеется корутины нельзя блокировать
Это же кооперативная многозадачность
Так мы уже плавно на TCP перешли?
Что мне мешает тоже переключить сокет (один! нахуя мне их 10000 для UDP?) в неблокирующий режим.
Оно опорожняет его в сетевую карту
Если он не успел это сделать, то
* There are only two reasons for sendto() to block:
Your outgoing UDP buffer is full, and it needs to wait until space frees up
вторая не важна
что не так?
>один! нахуя мне их 10000 для UDP?
например чтобы слать нескольким клиентам
UDP сокет можно "коннектить". На самом деле это не коннект, но гарантия, что ты получишь ICMP о недоступности удаленного питуха
Х.з., это к тебе вопрос... Я так и не поняла, что за магия у вас там в "асинхронных сокетах" есть, которую я не могу настроить и обработать из няшной.
> гарантия, что ты получишь ICMP
Х.з., в UDP протоколах обычно хертбиты есть. Ну кто-то из нас получит таймаут если что-то со связью. Не вижу смысла коннектить сокет, усложнять логику и тратить ресурсы ядра на какую-то хуйню.
Есть какая-то статья, где описаны реальные преимущества коннекта? Например, что так больше клиентов можно будет обработать или пирфоманс вырастет.
Ты триггернулся на буфер
Я привел пример того, что в UDP тоже есть буфер)
> Я так и не поняла, что за магия у вас там в "асинхронных сокетах" есть, которую я не могу настроить и обработать из няшной.
В няшной ты можешь сделать что угодно, вопрос в количестве кода и его "высокоуровневости"
Неблокирующие сокеты из няшной скорее всего вернуть тебе EAGAIN или что-то такое при заполнении буфера, и попросят тебя попробовать снова
Ты должен будешь сам это обработать.
Либо ты сможешь взять select/poll/epoll, и слушать, когда сокет станет доступным для записи.
В корутинах же ты пишешь так, словно бы ты в своем потоке, живешь, и спокойно блокируешься на вызове send (или как оно там называется)
Под капотом там разумеется или неблокирующие сокеты или epoll, мне (как высокоуровневому питуху) это не важно.
>Есть какая-то статья, где описаны реальные преимущества коннекта?
https://it.wikireading.ru/7156
>>>
3. Асинхронные ошибки возвращаются процессу только при операциях с присоединенным сокетом UDP. В результате, как мы уже говорили, неприсоединенный сокет UDP не получает никаких асинхронных ошибок.
>>>
---------
на самом деле мой пример можно перевести и на TCP, если тебе удобнее.
И даже на обычные генераторы, которые должны подождать N секунд, и что-то сделать
В няшной пришлось бы делать ALARM или вон ебаться с очередями или плодить треды
В корутинах достаточно сахара, чтобы писать последовательно
Неблокирующая функция `delay` передает управление другой корутине, но для программиста выглядит как slepp
Сделать вид, что всё ушло и забить? Я очень удивлюсь, если ваша либа задерживает отправку UDP пакета, а не просто выбрасывает его и возвращает корутине ошибку.
Что касается connect'а -- это же чисто клиентская фишка. Я же не буду зашкваривать серверный сокет под конкретного клиента. И заводить новый под каждого тоже будет как-то странно.
нет, попробовать снова
>Я очень удивлюсь, если ваша либа задерживает отправку UDP пакета,
хм, а в чем проблема так делать?
Если она умеет делать это для TCP, то почему не делать для UDP?
>Что касается connect'а -- это же чисто клиентская фишка.
> Я же не буду зашкваривать серверный сокет под
> конкретного клиента.
connect будет создавать новый сокет, конечно
но не понятно, почему нашему гипотетическому серверу это не сделать
архитектуры бывают разные)
> И заводить новый под каждого тоже будет как-то >странно.
Если ты хочешь получать ICMP о недоступности клиента то вполне можно так делать
Но вообще мы ушли куда-то не туда кмк)
Корутины позволяют тебе писать последовательный код, используя вместо настоящих блокирующих функций -- специальные не блокирующие
Код выглядит последовательно, как если бы ты каждую корутину запускал в отдельном процессе
Причем в котлине они образуют "дерево", где родитель неявно ждет всех своих детей, и можно стопнуть родителя с детями одновременно
Открыл Activity в Андроиде -- запустилось 10050 корутин (на одном потоке), каждая инкапусилует какую-то задачу
Закрыл активити -- все стопнулись
Немножко испортит работу протоколов, в которых тайминги важнее тухлятины...
> connect будет создавать новый сокет, конечно
Шта?!
Ты же не знаешь что у нас за гипотетический протокол)
>Шта?!
ты не можешь присоединить сокет к двум адресам, так?
стало быть нужно создать по сокету на клиента и каждому сделать connect, не?
зы: я наверное написал так, что прочиталось будто `connect` создает сокет)))
Это не так, конечно. Сокет создает `socket`, и вероятно кишки `accept`
Практика показывает, что на UDP все протоколы такие... Нет никакого смысла ретраить тухлятину и задерживать из-за неё все последующие пакеты. Не влезла в полосу -- значит не влезла.
> я наверное написал так, что прочиталось будто `connect` создает сокет)))
Ага.
Да и почему сразу тухлятину?
Если буфер заполнен, то почему я не могу подождать и послать еще?
Это же UDP, это же не у принимающей стороны буфер заполнен (мне похуй на нее, я может вообще мультикаст) это у меня буфер заполнен
Дык она у тебя уровнем выше будет. А кишки реактора не должны принимать это решение за тебя (если ты явно не попросил).
Что будет если я пишу в сокет, а буфер забит?
Будет блокировка треда, верно?
Вот было бы логично ждать что и ktor сэмулирует такое поведение
Ну ок. А неблокирующие можно попросить?
> почему я не могу подождать и послать еще
Потому что у тебя на выходе уже огромная очередь, которая не успевает высираться в провод. И вместо того чтобы отдать приоритет свежим, актуальным пакетам, ты продолжаешь пытаться спасти старые, менее актуальные.
Могу, но зачем мне тогда корутины?
Я тогда могу на одном треде срать в 1000 сокетов обычным циклом. Если запись вернет EGAIN, то я просто дальше пойду, и всё.
Корутины будут не нужны
>свежим, актуальным пакетам
Типа раз я взял UDP, то обязательно семантика такова, что проебать старый пакет не так страшно, как тормознуть новый?
Х.з., возможно у меня синдром утёнка. Можно Снаута спросить.
Сам ключ лицензии может быть длинным симметричным ключом. Ну если с этой лицухой уже зарегился другой ID, то сервер шлет нахуй. Можно еще мультикастом искать в своей сети другие копии себя: хуже не будети
Чтобы сломать схему, нужно либо спиздить приватный ключ сервера (что сложно) либо поломать твою программу. Вот тут уже надо при запуске считать хеш бинаря, детектить дебагер, детектить виртуалку и пр. Это довольно сложный и муторный процесс, конкретные решения зависят от языка и окружения. Если твои клиенты это копроративщики, то можно не запариваца
Если ключ могут вырезать, то такие проверки тем более?
Но точно я не знаю
Это зачем?
В ночь на субботу неизвестный мужчина проник в зоопарк "Ослиное место". Преступник зашел в вольер к осликам и изнасиловал одно животное. После извращенец пытался осквернить еще двух животных, но его спугнул сторож.
Ксстати
В соответствии с этими хадисами, запретным для мусульман является мясо домашних ослов, поскольку те питаются нечистотами. В то же время, мясо диких ослов, пасущихся на воле, считается халяльным.
g: Землячество Алании ДНР
А какой у вас оффер, не расскажете? Чё за компания?
https://habr.com/ru/articles/756562/
Личный опыт работы в IT и более 15 мест работы за 10 лет
В 2010 сходил в армию, интересно отслужил, а дальше нужно было начинать работать.
десятки команд, огромные опенспейсы, холодильники набитые едой на каждом этаже, соки, фрукты, сыры и колбаса в любом количестве на каждом этаже
https://habr.com/ru/articles/755970/
Австралия является убедительным примером для DevOps, так как большая часть страны находится в одном часово