Size: a a a

Rust — русскоговорящее сообществo

2020 August 15

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
Та блин
источник

АК

Андрей Казанцев... in Rust — русскоговорящее сообществo
Антон ⚙️
self.get_possible_matches(&mut *order)
Написал выеше
источник

АК

Андрей Казанцев... in Rust — русскоговорящее сообществo
В чём причина того что не сработало? Говорили что пофиксили чекер в 2018 и не надо так писать больше.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Не работает? @ozkriff, полагаю.
источник

РФ

Руслан Фадеев... in Rust — русскоговорящее сообществo
Он вроде устал
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Такой вопрос
У меня есть несколько (не очень много) внешних сущностей (процессов, вебсокетов)
Мне нужно отправить в каждую информацию, получить ответ, потом повторить. Т. е. сначала я жду ответа от всех, и только потом начинаю снова посылать запросы, причём ответ жду с таймаутом.
Я не уверен, как это лучше сделать.
Можно порождать тред на каждого клиента. Можно вместо этого их спаунить в асинк-тасках, наверное? Но я не могу сходу придумать, как в Rust это сделать на них. Ещё есть actix с акторами, которые, вроде как, тоже подходят под проблему.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
select!(timeout_future, futures.join_all())


Кажется, так выражается то, что я хочу сказать
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Но это оставляет вопросы, где хранить футуры, чтобы они не дропнулись
Сделать, типа,
struct State {
   channels: Vec<Channel>,
   clients: Vec<Future>,
}

?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Такой вопрос
У меня есть несколько (не очень много) внешних сущностей (процессов, вебсокетов)
Мне нужно отправить в каждую информацию, получить ответ, потом повторить. Т. е. сначала я жду ответа от всех, и только потом начинаю снова посылать запросы, причём ответ жду с таймаутом.
Я не уверен, как это лучше сделать.
Можно порождать тред на каждого клиента. Можно вместо этого их спаунить в асинк-тасках, наверное? Но я не могу сходу придумать, как в Rust это сделать на них. Ещё есть actix с акторами, которые, вроде как, тоже подходят под проблему.
let mut connections: Vec<_> = /* */;
connections.iter_mut().for_each(|x| x.set_nonblocking().unwrap());

// Vec<bool> with the length of the connections.
let mut is_ok = BitVec;

let mut ok_resp = Vec::new();

loop {
 let deadline = Instant::now() + SOME_DURATION;

 while Instant::now() < deadline {
   for idx in (0..connections.len()).rev() {
     let c = connections[idx];
     if !is_ok.get(idx) {
     match c.read(buf) {
       Ok(n) => { is_ok.set(idx); ok_resp.push((c.socket(), n)); },
       Err(_) => (),
     }
     }
   }
 }

 for idx in (0..connections.len()).rev() {
   if !is_ok.get(idx) { connections.swap_remove(idx); }
 }
 is_ok.truncate(connections.len());
 is_ok.unset_all();

 /* На оставшиеся фигачишь дальше */
}
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
let mut connections: Vec<_> = /* */;
connections.iter_mut().for_each(|x| x.set_nonblocking().unwrap());

// Vec<bool> with the length of the connections.
let mut is_ok = BitVec;

let mut ok_resp = Vec::new();

loop {
 let deadline = Instant::now() + SOME_DURATION;

 while Instant::now() < deadline {
   for idx in (0..connections.len()).rev() {
     let c = connections[idx];
     if !is_ok.get(idx) {
     match c.read(buf) {
       Ok(n) => { is_ok.set(idx); ok_resp.push((c.socket(), n)); },
       Err(_) => (),
     }
     }
   }
 }

 for idx in (0..connections.len()).rev() {
   if !is_ok.get(idx) { connections.swap_remove(idx); }
 }
 is_ok.truncate(connections.len());
 is_ok.unset_all();

 /* На оставшиеся фигачишь дальше */
}
Немного сурово
Хотелось бы как-то более высокоуровнево
источник

Э

Эрик in Rust — русскоговорящее сообществo
Можешь в match по .read сделать ветку
Err(e) if e.kind() == WouldBlock => (),
Err(_) => { connections.swap_remove(idx); }
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
let mut connections: Vec<_> = /* */;
connections.iter_mut().for_each(|x| x.set_nonblocking().unwrap());

// Vec<bool> with the length of the connections.
let mut is_ok = BitVec;

let mut ok_resp = Vec::new();

loop {
 let deadline = Instant::now() + SOME_DURATION;

 while Instant::now() < deadline {
   for idx in (0..connections.len()).rev() {
     let c = connections[idx];
     if !is_ok.get(idx) {
     match c.read(buf) {
       Ok(n) => { is_ok.set(idx); ok_resp.push((c.socket(), n)); },
       Err(_) => (),
     }
     }
   }
 }

 for idx in (0..connections.len()).rev() {
   if !is_ok.get(idx) { connections.swap_remove(idx); }
 }
 is_ok.truncate(connections.len());
 is_ok.unset_all();

 /* На оставшиеся фигачишь дальше */
}
Подожди, тут чтение получается не параллельное
источник

Э

Эрик in Rust — русскоговорящее сообществo
Нонблочное.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
А, в самом деле. Энивей, это какое-то переизобретение ивентлупа, кажется.
источник

Э

Эрик in Rust — русскоговорящее сообществo
источник

ph

pl 🦑 hk in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Такой вопрос
У меня есть несколько (не очень много) внешних сущностей (процессов, вебсокетов)
Мне нужно отправить в каждую информацию, получить ответ, потом повторить. Т. е. сначала я жду ответа от всех, и только потом начинаю снова посылать запросы, причём ответ жду с таймаутом.
Я не уверен, как это лучше сделать.
Можно порождать тред на каждого клиента. Можно вместо этого их спаунить в асинк-тасках, наверное? Но я не могу сходу придумать, как в Rust это сделать на них. Ещё есть actix с акторами, которые, вроде как, тоже подходят под проблему.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну, насколько я знаю, тот же RA таки переизобрёл ивент луп под себя.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Там по количеству коннекшонов, а не по таймеру, не?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
Ну, насколько я знаю, тот же RA таки переизобрёл ивент луп под себя.
Мне не нужна безумная производительность RA для анализа мегабайтов кода
источник

ph

pl 🦑 hk in Rust — русскоговорящее сообществo
Таймер делается через таймаут. Это часть "жду ответа от всех"
источник