Size: a a a

2020 April 08

P

Pavel in rust_offtopic
Alex Zhukovsky
s/кто-то/все, кроме Павела

:)
s/кто-то/тот, кто не писал свои асинхронные фреймворки/
источник

ЕС

Егор Савельев... in rust_offtopic
Pavel
внутри эта функция синхронная, потому что каждый её шаг полностью выполняется до того, как начнётся следующий. Но кто-то её может назвать асинхронной просто потому, что она дружественна асинхронному фреймворку и может добровольно делить вычислительные ресурсы с другими функциями дружественными асинхронному фреймворку.
Если в программе нет никаких друг действий кроме этой функции, то можно сказать что эта функция синхронная. Если же в программе есть другие функции, то эта функция после await передаст управление обратно экзекьютору.
источник

P

Pavel in rust_offtopic
в примере намного выше await ждал завершения того, что только что начал
источник

r

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

ЕС

Егор Савельев... in rust_offtopic
Pavel
в примере намного выше await ждал завершения того, что только что начал
Экзекьютор в это время может выполнять любые другие таски
источник

P

Pavel in rust_offtopic
Егор Савельев
Экзекьютор в это время может выполнять любые другие таски
которые ничего не знают об этой функции и о которых эта функция ничего не знает
источник

ЕС

Егор Савельев... in rust_offtopic
Pavel
которые ничего не знают об этой функции и о которых эта функция ничего не знает
Да
источник

P

Pavel in rust_offtopic
red75prime
Там нет шагов. Там есть набор состояний. Код, который осуществляет переход между этими состояниями, не ходит по этим шагам, он крутится в цикле экзекьютора.
"шаги" — выражения.
источник

P

Pavel in rust_offtopic
потому они никак не связаны с синхронностью самой функции
источник

ЕС

Егор Савельев... in rust_offtopic
Pavel
потому они никак не связаны с синхронностью самой функции
Синхронная функция бы дождалась 100 миллисекунд, выполнила действие и только потом отдала бы управление экзекьютору
источник

ЕС

Егор Савельев... in rust_offtopic
Синхронность ввода вывода это не синхронизация между потоками
источник

P

Pavel in rust_offtopic
Егор Савельев
Синхронная функция бы дождалась 100 миллисекунд, выполнила действие и только потом отдала бы управление экзекьютору
нет, синхронная функция бы выполняла свои шаги в строгой временной последовательности, впротивовес асинхронной функции, для которой порядок выполнения во времени задан не строго, или не задан вообще. Синхронная функция заканчивает работу до того, как вернуть результат, асинхронная — может закончить работу после возвращения результата, а результат обычно — жетон, с которым можно сходить спросить закончила ли она выполнение и что она там нового вернула.
источник

P

Pavel in rust_offtopic
Егор Савельев
Синхронность ввода вывода это не синхронизация между потоками
синхронный ввод-вывод сделан поверх асинхронных прерываний, синхронности не существует?
источник

r

red75prime in rust_offtopic
Pavel
"шаги" — выражения.
let a = foo().await; - это не выражение, это часть конечного автомата. foo() не вызывается при выполнении асинхронного кода, она вызывается при создании конечного автомата.
источник

P

Pavel in rust_offtopic
red75prime
let a = foo().await; - это не выражение, это часть конечного автомата. foo() не вызывается при выполнении асинхронного кода, она вызывается при создании конечного автомата.
и создание этого автомата — синхронно
источник

P

Pavel in rust_offtopic
короче, для меня лично асинхронная функция делает fork, хотя бы один. Если она их не делает — она синхронна по отношению к себе
источник

P

Pavel in rust_offtopic
и если она вернёт токен того, что она форкнула и на нём сразу ждать, то её вызов становится тоже синхронным.
источник

r

red75prime in rust_offtopic
Pavel
и создание этого автомата — синхронно
Как напишешь так и будет. Можно и асинхронно создавать. async fn foo() -> impl Future<...> { let a = bar().await; baz(a) }
источник

P

Pavel in rust_offtopic
red75prime
Как напишешь так и будет. Можно и асинхронно создавать. async fn foo() -> impl Future<...> { let a = bar().await; baz(a) }
тут она синхронна по отношению к bar и тому, что он вернул
источник

r

red75prime in rust_offtopic
Pavel
тут она синхронна по отношению к bar и тому, что он вернул
Не синхронна, а зависима по данным.
источник