LINUX.ORG.RU

Как понять асинхонщину в Rust?

 , ,


0

5

В Rust какая-то очень «самобытная» асинхронщина, понять её сложно. Итак, необходимый минимум - реализовать трейт Future. Дольше веселее - есть несколько каких-то малопонятных сущностей, которые за что-то там отвечают, пока непонятно, за что.

Читал кучу мануалов, они из серии: https://sun1-16.userapi.com/impg/cTOihOqKWsJSPD6uBUB6KTQZY823V6f3TzS9Tw/5VAn_b_1JUI.jpg?size=1080x1080&quality=96&proxy=1&sign=3ec0c8687655c3ac555d4b06874cfc49&type=album

Как правильно достать значение из Future? 101 вопрос. Когда Future реализуется сам, а когда его необходимо реализовать самому? Я так понял, логика реализуется в poll(), нет?

Мне нужно, например, читать стдаут порождённого процесса или поток миди-данных в рандомное время на вводе.

Кто распишет вменяемый хеллоуворлд, скину на пиво;)

★★★★★

Ответ на: комментарий от anonymous

Да, в очередной раз видно рядового анонимного балабола. Которая никогда не покажет конкретики. Ну дак ты же прочитал, понял? Сможешь мне показать ошибку? Ой, не сможешь? Потому что её нет и на самом деле ты ничего не читал? Позорище.

rafyibofye
()
Ответ на: комментарий от vlad9486

Простой пример https://github.com/spacejam/extreme

Отвечу на тему этой потуги:

https://github.com/spacejam/extreme/blob/master/src/lib.rs#L34 - это фейчина, которая ничего не показывает. Она не async. Это просто преобразование async в блокирущий вызов. Это никому не интересно.

Но здесь чётко видно как работает это дерьмо. Оно просто долбит пока пока не будет Poll::Ready. Это элементарная херня.

Именно для того, чтобы не долбить(вернее долбить оно будет всегда. просто как-то оптимизировать долбёжку, чтобы оно совсем позорно не тормозило) эту херню и существует рантайм и вопрос именно касается его.

Ну и, конечно же, unsafe на unsafe, т.е. это в принципе не недоязычок.

rafyibofye
()
Ответ на: комментарий от rafyibofye

В жс push-модель и там ненужен никакой говнорантайм

Ты сделал мой день. Еще скажи что мусор там богом собирается, а не рантаймом

q0tw4 ★★★★
()
Ответ на: комментарий от rafyibofye

Да, это элементарная херня. Как раз то что нужно для первого знакомства. Для того чтобы оно так позорно не тормозило есть следующая ссылка, показывающая как использовать сискол poll (epoll будет почти также), но это уже не зависит от языка, просто читаешь доку по сисколу и делаешь.

vlad9486
()
Ответ на: комментарий от vlad9486

Нет, она ненужна. Ни для какого первого знакомства. Задача состоит не в том, чтобы заблокировать исполнение, а чтобы продолжить выполнение.

Для того чтобы оно так позорно не тормозило есть следующая ссылка

Ты всё перепутал. Это никак не связано с тем, о чём говорю я.

показывающая как использовать сискол poll (epoll будет почти также)

Нет, это опять блокирующие api. Это всё нелепые фокусы, которые не имеют отношения к сути.

Тормозит там сама модель, а не блокировка.

но это уже не зависит от языка, просто читаешь доку по сисколу и делаешь.

Зависит. Мы обсуждаем не мультиплексинг, а poll/push. Ты попытайся не повторять херню из методички, а подумать.

Никакой «сискол poll (epoll» не имеет отношения к делу, не имеет отношения к проблеме. И нахрен ненужен для примеров и для асинхронщины. Это в принципе не асинхронное api даже.

rafyibofye
()
Ответ на: удаленный комментарий

Я так же приводил пример и с С++

Кстати надо бы почитать про С++20 и как там все устроено. В более ранних стандартах это boost::asio, которое и есть рантайм, а у фьюч даже then нету и все что остается бедному кодеру, так это замораживать поток на wait

q0tw4 ★★★★
()
Ответ на: комментарий от vlad9486

Просто воспринимай любой асинхронной api через read(fd, on_data) и тогда ты не будешь путаться.

У тебя нет каких-либо блокировок и прочей херни, которую пишет пропагандисты для того, чтобы запутать тебя.

Вот твоя задача реализовать async_read. В рамках нормальной модели это делается элементарно - read(fd, [](data){result = data; f.resume();})

Вот реализуй тоже самое. Откроешь для себя много нового. А сожрать пропаганду и повторить какую-то чушь про сискол - это ничего не стоит и никаким пониманием тебя не наделяет.

rafyibofye
()
Ответ на: комментарий от rafyibofye

Мы обсуждаем не мультиплексинг, а poll/push.

Заведи свою тему и обсуждай что хочешь. Мы здесь обсуждаем вопрос автора темы.

Мне нужно, например, читать стдаут порождённого процесса или поток миди-данных в рандомное время на вводе.

Если это один процесс, то ему не нужен epoll. Если процессов очень много и они непредсказуемо что-то выводят, тогда нужен epoll, чтобы использовать меньше системных потоков (вообще один может быть).

vlad9486
()
Последнее исправление: vlad9486 (всего исправлений: 1)
Ответ на: комментарий от q0tw4

Кстати надо бы почитать про С++20 и как там все устроено.

Этому лет больше, чем расту.

В более ранних стандартах это boost::asio

Никакого asio к теме отношения не имеет. И никаких стандартов не существует.

которое и есть рантайм

Нет, ты опять всё перепутал. рантайм для А это не рантайм для Б. Там рантайм совершенно для другого.

Там, в том числе, есть и корутины. Так же там есть стековые корутины, либо гринтреды, либо у них много названий. Т.е. go-модель.

Всё это push-модель. Твоё же дерьмо - poll-мусор.

а у фьюч даже then нету и все что остается бедному кодеру, так это замораживать поток на wait

Чего? future в С++ вообще другая херня и там есть get и это блокирующая сущность, никакого отношения не имеет к асинхронище.

К тому же в ситуации с юзерпейс-тредами - это не является проблемой. Потому как async именно что эмулирует блокирующие api.

Вообще в языке имеющим доступ к потоку управления это async-дерьмо ненужно в принципе.

rafyibofye
()
Ответ на: комментарий от vlad9486

Заведи свою тему и обсуждай что хочешь. Мы здесь обсуждаем вопрос автора темы.

Автор обсуждает асинхронищу, а не мультиплексинг. Это ты заведи отдельную тему. Ты пришёл со своей пропагандой и решил подменить контекст.

Если это один процесс, то ему не нужен epoll. Если процессов очень много и они непредсказуемо что-то выводят, тогда нужен epoll, чтобы использовать меньше системных потоков (вообще один может быть).

Зачем ты повторяешь херню из методички? Никакой epoll никому нахрен ненужен, никакие потоки к теме отношения не имеют.

Есть асинхронные сокеты - это такая же poll-херня, epoll же это push-модель поверх. тебе никто не мешает так же как в твоём дерьме долбить read.

Зачем ты что-то пишешь, если всё что ты пишешь - это ретрансляция херни из какой-то стетейки дерьма, где ты нихрена ничгео не понял, как и автор этой херни? Для чего всё это?

Тебе сказали, что epoll к теме отношения не имеет и тебе дали задачу. Ты тут же съехал, почему?

К тому же ты даже что такое epoll и нахрена он нужен не знаешь. О чём ты вообще?

rafyibofye
()
Ответ на: комментарий от rafyibofye

Это ты ничего не понял и пишешь ретрансляции из дерьма. Зачем ты даешь задачи? Научить меня хочешь? Ты уверен что это мне нужно?

vlad9486
()
Ответ на: комментарий от vlad9486

Это ты ничего не понял и пишешь ретрансляции из дерьма.

Найдёшь источник моей ретрансляции? Твоей даже и искать не пришлось - первая ссылка в гугле, да и ты и сам её предоставил.

Зачем ты даешь задачи?

Это то, о чём просил ТС, это базовая задача, которую решает асинхронщина.

Научить меня хочешь?

Зачем? Я уже говорил об основном свойстве адептов раста. Я просто показываю твою несостоятельность публике. Сделаешь ты из этого какие-то выводы, либо нет - мне неинтересно. Это уже на твоей совести.

Ты уверен что это мне нужно?

Нет, конечно. Если бы это было тебе нужно, то ты бы не стал адептов и что-то понимал, а не ретранслировать херню без возможности ответить на очевидные вопросы.

Здесь как максимум можно уповать на то, что боль от собственной неспособности к ответу смотивирует тебя хоть минимально разобраться в теме и не нести херню в следующий раз.

rafyibofye
()

Раст говно. Используй нормальные ЯП!

anonymous
()
Ответ на: комментарий от rafyibofye

Меня смешит дискуссия в целом.

И rust, ИМХО, не мой выбор. Я за сахарок. Мне для вашей парадигмы шарпея с головой.

А ты как всегда с шашкой наголо. На любой чих. Вот это и удивляет. Из тебя лёгкая еда. Как по мне, это связано с нырянием тобой на самую глубину, когда глобально мы все плаваем в какахах. А ты бисерок, то, сё. Скука!

white_bull
()
Последнее исправление: white_bull (всего исправлений: 1)

Кто распишет вменяемый хеллоуворлд, скину на пиво;)

Вменяемый хеллоуворлд - это tokio.

anonymous
()
Ответ на: комментарий от anonymous

Я читал всю актуальную докментацию - РастБук и книгу по Асинк, насколько смог осилить. Ответа просто нет. В Книге по Асинк даются примеры в духе «дети, двайте нарисуем зайца и говна и лапок», хорошо, а теперь «давайте с кучей матана и непонятных сущностей, смысл которых мы вам не объясним, распишем то же самое на 200 строк».

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от white_bull

И rust, ИМХО, не мой выбор. Я за сахарок. Мне для вашей парадигмы шарпея с головой.

Ты не за сахарок, ты просто не фанатик. У тебя есть два выбора - первый это скриптуха, где во главу угла ставится удобство и поменьше думать. Второй - это не-скриптуха, где во главу угла ставятся возможности.

Вот раст выбивается из базовой парадигмы. Это дерьмо не обладает никакими возможностями, т.е. по возможностям это скрипутха, но и он так не обладает каким-либо удобством, выразительностью и прочим.

Единственный, кому подходит такое дерьмо - это фанатики. Т.е. те, кто либо просто поехавший, либо ищет иной выгоды, вне языка. Примеры я уже приводил. В расте минимальная конкуренция и все, кто не состоялся здесь - идут туда, в надежде, что там они получать больше, тем здесь. И это действительно так, в основном все идолы - это не более чем посредственности, которые вошли в область в момент её зарождения.

rafyibofye
()
Ответ на: комментарий от meliafaro

Я тебе уже сообщил достаточно. Ты не понимаешь потому, что тебе и не объясняют это.

Есть базовая модель. Она работает очевидным образом. Просто долбишь poll. Там тебе примеры кидали.

Но далее идёт уже как раз то, что тебе непонятно. Это всякая магия дерьма, которая из этого poll-говна сделать push-огрызок. Но тебе это никто и не пытается объяснить. Это а) невыгодно пропаганде, б) ты этого итак не поймёшь, скорее всего.

rafyibofye
()
Ответ на: комментарий от rafyibofye

А ну-ка вброшу слегонца: я топлю за Zig ;) (на самом деле я притапливаю за мутанта, который родят в MSResearch на старой/новой парадигме), хотя скриптуха семимильными щами подминает под себя всё на свете. И щи уже не так воняют.

white_bull
()
Ответ на: комментарий от meliafaro

Спасибо, редкий регистрант, предлагающий что-то, кроме очередной итерации срача.

Опа! Тролль ожил!

white_bull
()
Ответ на: комментарий от rafyibofye

poll-мусор

Насколько я понял, полл нужен для того, чтоб не вводить некую сущность в языке, которая будет управлять потоком исполнения из тени. Вот чтоб вместо такой мути была либа Васи, которая сама решает в каком порядке фьючи пинать и как на потоки распределять, приходится делать менее удобную модель. Как тут справился С++ надо смотреть, только вопрос в каком компиляторе асинк уже начал поддерживатся?

q0tw4 ★★★★
()
Последнее исправление: q0tw4 (всего исправлений: 1)
Ответ на: комментарий от meliafaro

Дружочек пирожочек - как ты думаешь вообще устроенны асинхронные вызовы? В любом случае какой-то поток будет 99% времени спать если обработка событий занимает только 1%. Вообще не важно - корутины это, очередь в юзерспейсе или в ядре. Эти ваши асинхронные вызовы по большей части просто удачный интерфейс к этим трём вариантам, хоть и в некий потенциальный ущерб эффективности.

Мой тебе совет - разберись сначала с классическим параллельным программированием, ибо есть всего два варианта:

  • ты понимаешь как это работает, и тебе становится понятно почему такой интерфейс, соответственно и интерфейс понятен
  • ты специалист по фреймворку, аля ангуляр-разработчик

Учитывая, что ржавчина позиционируется как язык для системной разработки, скорее всего разработчики API, подразумевают, что пользоваться этими интерфейсами будут системные разработчики (вот неожиданность?), понимающие как эти самые системы функционируют.

pon4ik ★★★★★
()
Ответ на: комментарий от q0tw4

Насколько я понял, полл нужен для того, чтоб не вводить некую сущность в языке, которая будет управлять потоком исполнения из тени.

Нет, не поэтому. В языке эта сущность ненужна. Просто poll примитивная херня и сам недоязычок просто не может выразить сложные концепции.

Вот чтоб вместо такой мути была либа Васи, которая сама решает в каком порядке фьючи пинать и как на потоки распределять

Боже, я тебе уже сообщил - тебя поимела пропаганда. Это никак не связано с какими-то потоками и порядками.

Проблема заключается в том, что когда завершилась твоя async-операция - она не может продолжить выполнять функцию. Ты просто не знаешь в какой функции она завершилась.

Иди почитай js и как там работает какой-то mobx - там это используется для реактивности. Вот у тебя точно так же, как в сприптухе, в рантаме создаётся вся эта байда с зависимостями и перезапуском.

А то, что пропаганда тебе рассказывает про какие-то потоки/шедулинг - тебя просто обманывают.

приходится делать менее удобную модель.

Нету менее/более удобной модели. Есть говно, а есть не-говно. Вот не-говно всегда можно свести к говну. Т.е. через push может выразить poll, но не наоборот.

Как тут справился С++ надо смотреть

Там есть ссылка на мою группу в телеге. Я там об этом писал. В С++ всё нормально.

только вопрос в каком компиляторе асинк уже начал поддерживатся?

Тебя опять поимела пропаганда. Этому асинку уже лет больше, чем твоему расту. И поддерживается во всех, кто реализовал либо ts, либо C++20.

anonymous
()
Ответ на: комментарий от q0tw4

Насколько я понял, полл нужен для того, чтоб не вводить некую сущность в языке, которая будет управлять потоком исполнения из тени.

Метод poll() придуман, чтобы избежать динамического выделения памяти, которого требуют классические калбеки. Благодаря нему код с async/await разворачивается компилятором в тот же самый конечный автомат, который раньше все писали руками, когда использовали select()/poll()/epoll(), т. е. фьючеры в Расте «бесплатные».

Вот предыстория: https://aturon.github.io/tech/2016/09/07/futures-design/

anonymous
()
Ответ на: комментарий от anonymous

Зачем писать в кавычках слово «бесплатный» вместо того, чтобы сказать очевидное «имеют свою цену»? Кого ты пытаешься надуть?

anonymous
()
Ответ на: комментарий от anonymous

чтобы избежать динамического выделения памяти, которого требуют классические калбеки

Контекст асинхронной операции где хранится в таком случае? Расскажи об этом подробнее

cloun1901
()
Ответ на: комментарий от anonymous

Тебе нужней, о твоем здоровье переживаю. И тем не менее, вопрос все еще актуален, кого ты пытаешься надуть, себя или окружающих?

anonymous
()
Ответ на: комментарий от pon4ik

Эти ваши асинхронные вызовы по большей части просто удачный интерфейс к этим трём вариантам, хоть и в некий потенциальный ущерб эффективности.

Ты раскрыл бы тему про эффективность, в треде же не только ТС. Хотя ему тоже интересно будет, наверное.

cloun1901
()
Ответ на: комментарий от cloun1901

Регистрант вконец обнаглел, всё разжуй и в рот положи, а он ещё выступает. РТФМ, животное.

anonymous
()

Как правильно достать значение из Future? 101 вопрос. Когда Future реализуется сам, а когда его необходимо реализовать самому? Я так понял, логика реализуется в poll(), нет?

Future - это монада, как заметили выше. Для них в языке есть свои удобные плюшки (комбинаторы, impl трейта, удобное создание замыканий, inlining для порождения эффективного кода). Реализация poll - дело десятое, которое важно, если тебе нужно будет реализовать что-то очень узко-специфичное, а именно «примитив» вычисления Future, что возникает крайне редко.

В большинстве случаев, твои фьючи будут создаваться через так называемые «комбинаторы», которые будут соединять между собой уже либо упомянутые примитивы, либо такие же составные фьючи. В результате получаются новые составные фьючи, полноценные реализации трейта Future. Собственно, в этом суть любой монады, не только фьючи.

А для более простой и удобной работы конкретно с фьючами в язык добавили еще и сахарок async/await. Может быть, с этим сахарком ты даже сможешь забыть о монадах, или никогда так и не узнать о них)

anonymous
()
Ответ на: комментарий от anonymous

Какая же нелепая херня. Ну и ссылка на пропаганду, как всегда, имеет много смысла. Действительно, сектант сам про себя всегда напишет, что он обгадился.

когда использовали select()/poll()/epoll(), т. е. фьючеры в Расте «бесплатные».

Никто такую херню не писал. Сектант опять всё перепутал. Я не понимаю, зачем эти клоуны постоянно ссылаются на какие-то ворованные select()/poll()/epoll(), которые к теме вообще отношения не имеют?

anonymous
()
Ответ на: комментарий от anonymous

Ну твой уровень с самого начала был ясен. И в том что ты обгадишься сомнений не было - школоту сразу видно. Я для проверки спросил.

cloun1901
()
Ответ на: комментарий от anonymous

Ещё один пример нелепой херни. Никакое Future к говнаде отношения не имеет, от говнады там лишь только то, что это такое же option. Да и даже это никакого отношения к говнаде не имеет.

Далее мы видим типичные оправдания дошколят. Он ничего не знает и просто несёт херню, поэтому и генерирует «ненужно», «бери готовое». Просто дошколёнок не знает и не может что-либо реализовать, поэтому ссылается на готовое, т.е. то, что уже реализовано теми, кто понимает.

Какой-то сахарок про «async/await» - это уже совсем клиника.

В результате фанатик ничего не сообщил, кроме чуши. А что самое интересное - всё, о чём он балаболил, попросту не имеет никакого отношения к теме.

Потому как в poll-дерьме всегда условный option, но это не имеет никакого отношения к асинхрнщине.

anonymous
()

Да, и это уже не в первый раз происходит. Сколько не спрашивал как оно «без кучи обходится» - никто ещё не ответил. А вот агитка перепащивается регулярно.

cloun1901
()
Ответ на: комментарий от q0tw4

Кресты ты вряд ли осилишь, поэтому я написал вам на жабаскрипте:

Вот С++, как и async/await в ts/C#/js и прочих, откуда раст это всё украл, всегда push.

Ты можешь просто пустить их как f() и они будут работать сами. Так же это работает в С++. Они возобновляют сами себя и всё это работает само, но ты так же можешь эти рулить - это не проблема.

Твоё же говно должно запускаться через ранер, который будет долбить твою футуру. Как ты понимаешь - это тормозящий мусор. Поэтому это говно в рантайме строить дерево зависимостей и пытается дёргать poll минимально, но оно а) никогда не будет минимально, б) это адский оверхед везде и всегда. Нужно все эти динамические связи хранить, собирать, уничтожать и так далее.

anonymous
()
Ответ на: комментарий от anonymous

Как-то ты быстро поломался. Кукарекал про «без кучи», но был умножен на ноль одним вопросом, который так и остался без ответа. А куда же подевалась твоя уверенность в себе, маня? Ты же можешь.

cloun1901
()
Ответ на: комментарий от anonymous

Узколобый ты какой-то, царь! Не понимаешь, что на одну и ту же задачу можно смотреть с разных ракурсов. Push-нотификации и монады прекрасно уживаются вместе.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.