Size: a a a

2021 October 13

KR

Kai Ren in Rust Async
Не могу, ошибки не мои =(
источник

f

folex in Rust Async
Угу, понимаю
источник

f

folex in Rust Async
Или в ErrorInner::cause нужен + 'static, но я не уверен что это помогло бы

тут https://docs.rs/tokio-postgres/0.7.3/src/tokio_postgres/error/mod.rs.html#362
источник

V

Vetro in Rust Async
источник

V

Vetro in Rust Async
Потому что обычно если держишь лок между .await'ами - то это уже запашок
источник

f

folex in Rust Async
Я раздумываю над тем чтобы вытащить кусок проекта из-под async_std::task::spawn_blocking. Сначала задумался про std::fs => async-fs, а потом про мьютексы.
источник

f

folex in Rust Async
Но возможно это глупая затея, и надо оставить всё под spawn_blocking
источник

f

folex in Rust Async
Спасибо 🙂

Я хотел async мьютексы использовать чтобы в рамках одного spawn_blocking(|| block_on(lock_and_run_long(key))), чтобы экзекьютор мог запустить как можно больше lock_and_run_long и дойти там до блокирующей операции.

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

f

folex in Rust Async
То есть допустим у нас 2 потока в blocking тред пуле. Тогда

без async мьютекса:
spawn_blocking(||
 lock_and_run_long(1) // <= took 1 thread to run long
 lock_and_run_long(1) // <= took 1 thread to wait for previous lock
 lock_and_run_long(1) // starve
 lock_and_run_long(2) // starve
)


с async:
spawn_blocking(|| block_on(async move {
 lock_and_run_long(1).await // <= took 1 thread to run long
 lock_and_run_long(1).await // <= met locked mutex, yielded
 lock_and_run_long(1).await // <= met locked mutex, yielded
 lock_and_run_long(2).await // <= took 1 thread to run long
}))
источник

f

folex in Rust Async
такая у меня в голове картинка рисуется, может я конечно что-то не так понимаю
источник

f

folex in Rust Async
возможно мне надо lock_and_run_long переписать на акторов и перестать из мьютекса делать очередь 🙂
источник
2021 October 20

m

mAX in Rust Async
я вот юзаю parking_lot::RwLock в асинхронном коде
понятно что если сделать лок и под ним будет .await это жуть, но быстренько записить чего-то куда-то в стейте вроде же норм?

вот конструкция вроде такого
if var_str.read().clone() == "str" {
 ...
}
заблочит ли код под и после if? вроде же мы создали блокировку, но она дальше не используется
получается вроде бы неявная переменная rwlock.. останется до конца скоупа и будет держать лок?
источник

f

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

m

mAX in Rust Async
если вот так писать, то вроде точно должно быть норм?
if { var_str.read().clone() }  == "str" {
 ...
}
но выглядит как какой-то изварт от незнания когда оно точно дропается) либо костыль)
источник

IB

Ivan Boldyrev in Rust Async
После вычисления выражения дропается. Если нет каких-то несовершенств в компиляторе. Энивей, guard не Send, так что код не скомпилируется, если что-то не так.
источник

DF

Dollar Føølish in Rust Async
исключение составляют if let/ while let
источник

DF

Dollar Føølish in Rust Async
там будет держаться до конца тела
источник

LB

Let Eat Bee in Rust Async
а такие проверки имеют смысл? ведь после нее, но до начала выполнения тела, прям через наносекунду значение может уже поменяться, разве нет?
источник

m

mAX in Rust Async
ну например мне нужно понять включена у нас запись в лог в конфиге в определенное место или нет
если оно даже изменится через наносекунду мне это не так важно
источник
2021 October 21

MB

Mikail Bagishov in Rust Async
Зависит от того, каких гарантий хочешь :)
Например методу poll() у футур разрешают дергать вейк несколько раз, и поэтому там подобные рейс кондишны не страшны.
источник