Size: a a a

2021 March 04

m

mAX in Rust Async
не понятно все равно.. можно как-то сохранять джойны с произвольным типом для того чтобы потом .abort() вызвать?
источник

K

Kitsu in Rust Async
mAX
не понятно все равно.. можно как-то сохранять джойны с произвольным типом для того чтобы потом .abort() вызвать?
Можно, да
источник

m

mAX in Rust Async
match join.downcast_ref::<tokio::task::JoinHandle<_>>() {
   
Some(join) => {
       join.abort();
       debug!("join.abort() ok");
   }
   
None => {
       println!("Can't cast Any to JoinHandle");
   }
}

ну вот такое не работает..
136 |         match join.downcast_ref::<tokio::task::JoinHandle<_>>() {
   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
Это если из Any пытаться без явного указания типа забрать join
источник

m

mAX in Rust Async
затолкать Any внутрь JoinHandle<> тоже не получается
источник

MB

Mikail Bagishov in Rust Async
mAX
не понятно все равно.. можно как-то сохранять джойны с произвольным типом для того чтобы потом .abort() вызвать?
Думаю, тебе придется еще при спавне мапать футуру, чтобы она возвращала Box<dyn Any>
источник

MB

Mikail Bagishov in Rust Async
Из того, что есть коэрсия T -> U не значит, что есть коэрсия Wrapper<T> -> Wrapper<U>
источник

m

mAX in Rust Async
Mikail Bagishov
Думаю, тебе придется еще при спавне мапать футуру, чтобы она возвращала Box<dyn Any>
попробовал так, но мне кажется сам подход какой-то у меня неправильный.. пишу как на js)
нужно наверное для тасков разного типа разные хранилища сделать на базе какого-то удобного TaskList<T>
ну и подключать к рантайму такое хранилище чтобы оно присматривать могло через удобные фукнции
источник

a

antuan in Rust Async
А мож FuturesUnordered попробовать?
источник

MB

Mikail Bagishov in Rust Async
antuan
А мож FuturesUnordered попробовать?
Он тоже требует один и тот же возвращаемый тип (точнее даже одинаковый тип всех футур)
источник

MB

Mikail Bagishov in Rust Async
mAX
попробовал так, но мне кажется сам подход какой-то у меня неправильный.. пишу как на js)
нужно наверное для тасков разного типа разные хранилища сделать на базе какого-то удобного TaskList<T>
ну и подключать к рантайму такое хранилище чтобы оно присматривать могло через удобные фукнции
Кстати, а зачем тебе вообще такая вещь нужна?
источник

a

antuan in Rust Async
Завернуть возвращаемый тип в энум?
источник

a

antuan in Rust Async
Ну или в трейт... в чем там смысл у возвращаемого значения?
источник

m

mAX in Rust Async
Mikail Bagishov
Кстати, а зачем тебе вообще такая вещь нужна?
я нагородил поверх js движка рантайм токио
и там нужно async/await функционал как-то обеспечить простой
setTimeout, setInterval, sleep сделал
но вот, например, какие-то функции типа fetch API уже требуют варианта посложнее фьючь с ()
источник

m

mAX in Rust Async
antuan
Завернуть возвращаемый тип в энум?
ну впринципе да, я так пробовал делать, но в коде было не очень удобно
источник

MB

Mikail Bagishov in Rust Async
mAX
я нагородил поверх js движка рантайм токио
и там нужно async/await функционал как-то обеспечить простой
setTimeout, setInterval, sleep сделал
но вот, например, какие-то функции типа fetch API уже требуют варианта посложнее фьючь с ()
Ну тогда видимо у тебя все футуры должны возвращать что-то типа JsValue, не?
источник

a

antuan in Rust Async
Mikail Bagishov
Ну тогда видимо у тебя все футуры должны возвращать что-то типа JsValue, не?
Лайк. Типа serde_json::Value. Что есть, опять же, энум.
источник

m

mAX in Rust Async
Mikail Bagishov
Ну тогда видимо у тебя все футуры должны возвращать что-то типа JsValue, не?
нативные функции JsValue возвращают, да
но в расте я ожидаю обычные растовские типы, когда фьюча reqwest::get допустим ответила, то я уже беру промайз JsValue который отдал движку при вызове fetch() из js и разрешаю его с каким-то там ответом.. говорю движку и запускаю цикл обработки сообщений движка

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

короче я нагородил TaskList<T> и впринципе удобно.. его можно подключить, следить есть ли очередь, прибивать если нужно и тд
кодишь fetch в отдельном модуле, базу в другом и тд, потом просто их подключаешь и все
источник

m

mAX in Rust Async
движок https://github.com/jerryscript-project/jerryscript
если интересно
источник

a

antuan in Rust Async
deno?)))
источник

MB

Mikail Bagishov in Rust Async
mAX
нативные функции JsValue возвращают, да
но в расте я ожидаю обычные растовские типы, когда фьюча reqwest::get допустим ответила, то я уже беру промайз JsValue который отдал движку при вызове fetch() из js и разрешаю его с каким-то там ответом.. говорю движку и запускаю цикл обработки сообщений движка

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

короче я нагородил TaskList<T> и впринципе удобно.. его можно подключить, следить есть ли очередь, прибивать если нужно и тд
кодишь fetch в отдельном модуле, базу в другом и тд, потом просто их подключаешь и все
ну вот допустим  ты реальзуешь fetch API, и делаешь это поверх reqwest. Тогда вывод растовой футуры тебе нужен только лишь для того, что скормить его JS-движку. Так что если ты частично сотрешь типа, перейдя от Future<Output = Vec<u8>> к Future<Output = JsValue>, то твой код никак не пострадает с т.з. type safety, а JoinHandle-ы станут однородными, и ты сможешь спокойно их хранить.

Если тебе не нравится, что тебе придется в футуры добавлять дополнительное преобразование, то это можно решить введением вспомогательного трейта ToJsValue, который будет реализован для всех нужных тебе растовых типов. И потом сделать вспомогательную функцию такого вида:
fn my_spawn<F, T>(fut: F)  -> JoinHandle<JsValue>
  where T: ToJsValue,
              F: Future<Output=T>
{
   tokio::task::spawn(fut.map(ToJsValue::to_js_value))
}
источник