Size: a a a

2021 January 13

D

Denis in Rust Async
вход обычно неявный
источник

D

Denis in Rust Async
скажем, I/O события или там срабатывание таймера
источник

m

magras in Rust Async
Denis
скажем, I/O события или там срабатывание таймера
Да, я понимаю. Но когда я слышу "конечный автомат" я представляю себе классическую стейт машину с явным входом.
источник

MS

Mikola Summer Duck in Rust Async
magras
Грубо говоря, в методе poll нет возможности передать пользовательские данные. Да, вход можно организовать, например, через канал, но это механизм, который находится немного сбоку от корутины.
Ну, юнитовый вход :)
источник

DF

Dollar Føølish in Rust Async
magras
Да, я понимаю. Но когда я слышу "конечный автомат" я представляю себе классическую стейт машину с явным входом.
Входные данные передаются при создании таска
источник

DF

Dollar Føølish in Rust Async
Вход есть просто не при каждом вызове полл
источник

DF

Dollar Føølish in Rust Async
Условно двухэтапная конвенция вызовов
источник

m

magras in Rust Async
Dollar Føølish
Входные данные передаются при создании таска
Входные данные для КА могут еще не существовать в момент создания КА. TCP стэк не знает какое событие произойдет в следующую секунду. Поэтому такие данные приходится через асинхронный канал передавать в корутину.

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

DF

Dollar Føølish in Rust Async
Ка в коде и ка в теории автоматов несколько разные вещи.

Корутины как микротреды и корутины как асинхронные таски тоже.

Ка в коде вполне подходит для реализации корутин как асинхронных тасков. Есть видео разбора такой реализации с романом Лисовским на примере котлин
источник

DF

Dollar Føølish in Rust Async
Там прямо показано преображение корутины в ка
источник

DF

Dollar Føølish in Rust Async
В обратную сторону не всегда возможно к сожалению
источник

DF

Dollar Føølish in Rust Async
Но в расте компиляцию в конечный автомат заменили генераторами эдак полгода назад
источник

m

magras in Rust Async
Dollar Føølish
Но в расте компиляцию в конечный автомат заменили генераторами эдак полгода назад
Генератор же тоже КА.
источник

DF

Dollar Føølish in Rust Async
Я про генераторы не совсем в курсе , видимо да
источник
2021 January 14

MB

Mikail Bagishov in Rust Async
magras
Да, я понимаю. Но когда я слышу "конечный автомат" я представляю себе классическую стейт машину с явным входом.
Генераторы принимают явный вход.
источник

MB

Mikail Bagishov in Rust Async
Просто асинк блоки это генераторы, у которых этот вход ResumeTy aka &mut Context<'_>
источник

MB

Mikail Bagishov in Rust Async
Но если ты пишешь кастомный генератор, то ты спокойно можешь брать скажем char в качестве resume argument
источник

MB

Mikail Bagishov in Rust Async
И наверное, можно передавать кастомные данные под видом контекста
источник

D

Denis in Rust Async
только вот чтоб получить какие-нибудь i/o события, приходится поллить другие футуры, что фактически тоже является входом
источник

MB

Mikail Bagishov in Rust Async
Ну вход в прямом смысле  - это именно контекст.
источник